POJ1118(几何)
题意:给出 n 个点的整数坐标(n<=700),求一条直线,使得在这条直线上的点数最多,输出点数。
解题思路:采用几何中的三个点是否在一条直线上判定定理:(yi-yk)/(xi-xk)=(yj-yk)/(xj-xk),除法不能出现分母为0的情况,所以转换为乘法做,即:(yi-yk)*(xj-xk)=(yj-yk)*(xi-xk)(i、j、k共线)。

1 #include<iostream>
2 using namespace std;
3 #define MAX 705
4 struct Point{
5 int x,y;
6 }p[MAX];
7 int main()
8 {
9 int n,i,j,k,a,b;
10 while(cin>>n&&n)
11 {
12 for(i=0;i<n;i++)
13 cin>>p[i].x>>p[i].y;
14 int sum,max=0;
15 for(i=0;i<n;i++)
16 for(j=i+1;j<n;j++)
17 {
18 sum=2;
19 for(k=j+1;k<n;k++)
20 {
21 a=(p[i].y-p[k].y)*(p[j].x-p[k].x);
22 b=(p[i].x-p[k].x)*(p[j].y-p[k].y);
23 if(a==b) sum++;
24 }
25 if(max<sum) max=sum;
26 }
27 cout<<max<<endl;
28 }
29 return 0;
30 }
2 using namespace std;
3 #define MAX 705
4 struct Point{
5 int x,y;
6 }p[MAX];
7 int main()
8 {
9 int n,i,j,k,a,b;
10 while(cin>>n&&n)
11 {
12 for(i=0;i<n;i++)
13 cin>>p[i].x>>p[i].y;
14 int sum,max=0;
15 for(i=0;i<n;i++)
16 for(j=i+1;j<n;j++)
17 {
18 sum=2;
19 for(k=j+1;k<n;k++)
20 {
21 a=(p[i].y-p[k].y)*(p[j].x-p[k].x);
22 b=(p[i].x-p[k].x)*(p[j].y-p[k].y);
23 if(a==b) sum++;
24 }
25 if(max<sum) max=sum;
26 }
27 cout<<max<<endl;
28 }
29 return 0;
30 }