题目大意:给出一系列的点,同在一条直线上的点最多有几个
解题思路:优化数据,不然会TLE,将那些遍历过的,同在一条直线上的点标记下,以免下一次遍历的时候重复有
#include<cstdio>
#include<cstring>
using namespace std;
struct node{
int x;
int y;
};
node n[1000];
int s[1000];
int N;
int g[1000][1000];
int main(){
int test;
char str[1000];
scanf("%d\n", &test);
while(test--) {
int count = 0;
while(gets(str) && str[0]) {
sscanf(str,"%d%d",&n[count].x, &n[count].y);
count++;
}
int max = -1;
memset(g,1,sizeof(g));
if(count == 2) {
printf("2\n");
}
else {
for(int i = 0; i < count ; i++)
for(int j = i + 1; j < count ; j++) {
if(g[i][j]) {
int cnt = 0;
for(int k = 0; k < count; k++)
if((n[i].x -n[k].x)*(n[i].y-n[j].y) == (n[i].x-n[j].x) * (n[i].y - n[k].y))
s[cnt++] = k;
if(cnt > max)
max = cnt;
for(int l = 0; l < cnt; l++)
for(int m = l + 1; m < cnt; m++)
g[s[l]][s[m]] = g[s[m]][s[l]] = 0;
}
}
printf("%d\n",max);
}
if(test)
printf("\n");
}
return 0;
}
还有另一种算法,这是借鉴别人的,将每个点当成原点,然后以这一点为起点,按斜率从小到大排序,一个个去求斜率相同的点,然后再以下一个点为起点去算