poj1118

学了一个小的知识点。

采用几何中的三个点是否在一条直线上判定定理:(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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值