/*题意:给出 n 个点的整数坐标(n<=700),求一条直线,使得在这条直线上的点数最多,输出点数。
枚举:采用几何中的三个点是否在一条直线上判定定理:(yi-yk)/(xi-xk)=(yj-yk)/(xj-xk),
using namespace std;
int a[710][2];
int main()
{
int n;
freopen("in.txt","r",stdin);
cin>>n;
while (n>0)
{
int i,j,k,ans=0;
for (i=1;i<=n;i++)
cin>>a[i][0]>>a[i][1];
for (i=1;i<=n-2;i++)
for (j=i+1;j<=n-1;j++)
{
int sum=2;
for (k=j+1;k<=n;k++)
{
int k1,k2;
k1=(a[i][1]-a[j][1])*(a[k][0]-a[j][0]);
k2=(a[k][1]-a[j][1])*(a[i][0]-a[j][0]);
if (k1==k2) sum++;
}
if (sum>ans) ans=sum;
}
cout<<ans<<endl;
cin>>n;
}
// cout << "Hello world!" << endl;
return 0;
}
枚举:采用几何中的三个点是否在一条直线上判定定理:(yi-yk)/(xi-xk)=(yj-yk)/(xj-xk),
除法不能出现分母为0的情况,所以转换为乘法做,即:(yi-yk)*(xj-xk)=(yj-yk)*(xi-xk)(i、j、k共线)。*/
#include <iostream>
#include <stdio.h>using namespace std;
int a[710][2];
int main()
{
int n;
freopen("in.txt","r",stdin);
cin>>n;
while (n>0)
{
int i,j,k,ans=0;
for (i=1;i<=n;i++)
cin>>a[i][0]>>a[i][1];
for (i=1;i<=n-2;i++)
for (j=i+1;j<=n-1;j++)
{
int sum=2;
for (k=j+1;k<=n;k++)
{
int k1,k2;
k1=(a[i][1]-a[j][1])*(a[k][0]-a[j][0]);
k2=(a[k][1]-a[j][1])*(a[i][0]-a[j][0]);
if (k1==k2) sum++;
}
if (sum>ans) ans=sum;
}
cout<<ans<<endl;
cin>>n;
}
// cout << "Hello world!" << endl;
return 0;
}