题意:给出n个点坐标,求最多能有几个点在一条直线上。
思路:需要求每一个点和其余点的斜率。然后排序,找到出现同一个斜率的最多的个数,记着这个数,然后和下一次比较取最大。
要点1:排序注意竖直线没斜率。
要点2:和上一次比较容易出错。
要点3:每个数的初值要注意。
易犯的错误代码:
#include<iostream>
#include<algorithm>
using namespace std;
#include<stdio.h>
int main()
{
int x[705],y[705];
double a[705];
int n;
while(scanf("%d",&n) != EOF && n)
{
int i;
for(i = 0;i < n; i++)
scanf("%d%d",&x[i],&y[i]);
int endnumber = 1;
for(i = 0;i < n; i++)
{
int j,t = 0;
for(j = 0;j < n; j++)
{
if(j == i)
continue;
if(x[j] == x[i])
a[t++] = 9999999;
else
a[t++] = ((double)y[j] - y[i])/(x[j] - x[i]);
}
sort(a,a+t);
int sum = 1;
for(j = 0;j < t; j++) //一个简便方法去找到最大在一条直线上的数
{
if(a[j] == a[j+1])
sum++;
else
if(sum > endnumber)
{
endnumber = sum;
sum = 1;
}
}
}
printf("%d\n",endnumber + 1);
}
return 0;
}
正确代码:
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int x[705],y[705];
double a[705];
int n;
while(cin>>n && n != 0)
{
int i;
int endnumber = 1;
for(i = 0;i < n; i++)
cin>>x[i]>>y[i];
for(i = 0;i < n; i++)
{
int j,t = 0;
for(j = 0;j < n; j++)
{
if(i == j)
continue;
if(x[i] == x[j])
a[t++] = 99999999;
else
a[t++] = ((double(y[j]) - y[i]))/(x[j] - x[i]);
}
sort(a,a+t);
int sum = 1;
for(j = 0;j < t; j++)
{
if(a[j] == a[j+1])
sum++;
else
{
endnumber = endnumber > sum ? endnumber : sum;
sum = 1;
}
}
}
cout<<endnumber+1<<endl;
}
return 0;
}