题目的意思就是给出n个点的坐标,选出最多的点,在一条直线上。
就是连接任意两点得到一条线,然后遍历每个点,算出在这条线上点的数量
代碼:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; char s[1000]; int x[1000],y[1000]; int len; void input() { len=0; while(gets(s)) { if(!s[0]) break; sscanf(s,"%d%d", &x[len],&y[len]); len++; } } bool isinline(int x1, int y1, int x2, int y2, int x3, int y3) { return (x1-x2)*(y3-y2) == (x3-x2)*(y1-y2)?true:false; } int main() { int n; scanf("%d", &n); getchar(); getchar(); while(n--) { input(); if(len==1) { printf("1\n"); if(n) printf("\n"); continue; } if(len==2) { printf("2\n"); if(n) printf("\n"); continue; } int ans = 0; int cnt = 0; for(int i=0; i<len; i++) { for(int j=i+1; j<len; j++) { cnt = 2; for(int k=j+1; k<len; k++) { if(isinline(x[i],y[i],x[j],y[j],x[k],y[k])) { cnt++; } if(cnt > ans) ans = cnt; } } } printf("%d\n", ans); if(n) printf("\n"); } return 0; }