给你N个点(N<700)
求最多在一条直线上的点。
枚举以每一个点为原点,求它与其他点的斜率,斜率相同则说明在同一条直线上。
只要枚举然后排序,最后求连续最长斜率相同的点就可以了。
AC代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int Arsize=701;
struct Node{
float x,y;
};
Node coordinate[Arsize];
int max_node;
double k_gradient[Arsize];
int main()
{
int case_num,i,num_coordinate,j,k,num,m,l;
char str[100];
cin >> case_num;
cin.get();
cin.get();
while(case_num--){
i=0;
max_node=0;
while(gets(str)){
if(!str[0])
break;
sscanf(str,"%f%f",&coordinate[i].x,&coordinate[i].y);
i++;
}
num_coordinate=i;
for(i=0;i<num_coordinate;i++){
for(j=0,k=0;j<num_coordinate;j++){
if(i!=j){
k_gradient[k++]=(coordinate[i].y-coordinate[j].y)/(coordinate[i].x-coordinate[j].x);
}
}
sort(k_gradient,k_gradient+k);
for(k=0;k<num_coordinate-1;k++){
for(m=k,l=k+1,num=2;k_gradient[m]==k_gradient[l];m++,l++,num++)
;
if(num>max_node)
max_node=num;
}
}
cout << max_node;
cout << endl;
if(case_num)
cout << endl;
}
return 0;
}