学了一个小的知识点。
采用几何中的三个点是否在一条直线上判定定理:(yi-yk)/(xi-xk)=(yj-yk)/(xj-xk),除法不能出现分母为0的情况,所以转换为乘法做,即:(yi-yk)*(xj-xk)=(yj-yk)*(xi-xk)(i、j、k共线)。
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#define M 1000
#define eps 1e-8
#define INF 0xffffffff
typedef struct {
int x,y;
}point;
point po[M];
int n;
double xl[M*M];
double solve(point a,point b)
{
if(a.x!=b.x)
{
return (a.y-b.y)*1.0/(a.x-b.x);
}
else
return INF;
}
int cmp(const void *a,const void *b)
{
return ((*(double*)a-*(double*)b>0)?1:-1);
}
int main()
{
int i,j,k;
int num1,num,maxn;
double tmp;
while(scanf("%d",&n)&&n)
{
for(i=0;i<n;i++)
{
scanf("%d%d",&po[i].x,&po[i].y);
}
maxn=-1;
for(i=0;i<n;i++)
{
k=0;num1=0;
for(j=i+1;j<n;j++)
{
tmp=solve(po[i],po[j]);
if(fabs(tmp-INF*1.0)<eps)
{
num1++;
}
else
{
xl[k++]=tmp;
}
}
qsort(xl,k,sizeof(xl[0]),cmp);
num=1;
for(j=1;j<k;j++)
{
if(xl[j]-xl[j-1]<eps)
num++;
else
num=1;
if(num>maxn)
maxn=num;
}
if(num1>maxn)
maxn=num1;
}
printf("%d\n",maxn+1);
}
return 0;
}