UVA 270 - Lining Up

题目大意:给出一系列点,要求找出共线的点数最大的值


解题思路:暴力,遍历每两个点确定的直线上又多少点, 每次更新最大值

三个点共线的性质:A(X1, Y1), B(X2, Y2), C(X3, Y3), 这个时候有(Y2 - Y1) / (X2 - X1) = (Y3 - Y2) / (X3 - X2)

最好转化成 (Y2 - Y1) * (X3 - X2) =  (Y3  - Y2) * (X2 - X1)

#include <cstdio>

int main() {
	int t, x[705], y[705];
	char str[100];
	scanf("%d\n\n", &t);

	while (t--) {
		int n, ans = 0;
		for (n = 0; gets(str) && str[0] != '\0'; n++)
			sscanf(str, "%d%d", &x[n], &y[n]);

		for (int i = 0; i < n; i++)
			for (int j = i + 1; j < n; j++) {
				int count = 0;
				for (int k = 0; k < n; k++)
					if ((y[j] - y[i]) * (x[k] - x[j]) == (y[k] - y[j]) * (x[j] - x[i]))
						count++;
				if (count > ans)
					ans = count;
			}
		printf(t ? "%d\n\n" : "%d\n", ans);
	}
	return 0;
}


你可能感兴趣的:(UVA 270 - Lining Up)