题意: 求在同一条直线上的点最多的个数;
郁闷,一开始就想如果挨个求斜率,然后找斜率相同最多的个数,会超时,可惜,真的暴力不会超时
斜率 k=(y1-y2)/(x1-x2);
但是得用 乘法算,因为当中可能会出现除数为零的情况
(y1-y2)*(x2-x3)==(x1-x2)*(y2-y3)
代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
#define maxnum 705
int n;
struct point
{
int x;
int y;
};
point p[maxnum];
int ma;
void solve()
{
int i,j,k;
ma=1;
int l=0;
for(i=0;i<n-2;i++)
{
if(ma>=n-1) break;
for(j=i+1;j<n-1;j++)
{
l=2;
for(k=j+1;k<n;k++)
{
if((p[i].y-p[j].y)*(p[j].x-p[k].x)==(p[i].x-p[j].x)*(p[j].y-p[k].y))
l++;
}
if(ma<l)
ma=l;
}
}
}
int main()
{
int i;
while(scanf("%d",&n)!=EOF)
{
if(n==0) break;
ma=0;
for(i=0;i<n;i++)
scanf("%d%d",&p[i].x,&p[i].y);
solve();
printf("%d\n",ma);
}
return 0;
}