URAL_1052
显然子弹的线路至少会通过两个点,于是我们枚举任意两个点就相当于枚举了所有可能的子弹的线路,这样每次再用叉积算一下有多少个点在直线上即可。
#include<stdio.h> #include<string.h> #define MAXD 210 int N, x[MAXD], y[MAXD]; int det(int x1, int y1, int x2, int y2) { return x1 * y2 - x2 * y1; } void init() { int i; for(i = 0; i < N; i ++) scanf("%d%d", &x[i], &y[i]); } void solve() { int i, j, k, ans = 0, t; for(i = 0; i < N; i ++) for(j = i + 1; j < N; j ++) { t = 0; for(k = 0; k < N; k ++) if(det(x[j] - x[i], y[j] - y[i], x[k] - x[i], y[k] - y[i]) == 0) ++ t; if(t > ans) ans = t; } printf("%d\n", ans); } int main() { while(scanf("%d", &N) == 1) { init(); solve(); } return 0; }