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;
}
posted on 2012-05-07 13:49  Staginner  阅读(267)  评论(0编辑  收藏  举报