题目来源: http://poj.org/problem?id=1118
题目大意:给你若干个点,让你找出最多有多少个点可以连成一条直线。
思路:
先取两个点,再找另一个点判断是否三点共线(用斜率)。
代码:
#include<iostream>
#include<cstdio>
using namespace std;
struct node
{
int x,y;
}a[800];//用结构体记录点
int main()
{
int n;
int sum;
int max;
int i;
int j;
int k;
while(scanf("%d",&n)==1,n)
{
max=0;//记录最大点数
for(i=0;i<n;i++)
{
scanf("%d %d",&a[i].x,&a[i].y);
}
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
sum=2;//前面二重循环找到两个点,sum赋值2。
for(k=j+1;k<n;k++)//再找另一个点
{
if((double)(a[i].y-a[j].y)*(a[j].x-a[k].x)==(double)(a[j].y-a[k].y)*(a[i].x-a[j].x))//判断是否共线
{
sum++;//共线,数量+1
}
}
if(sum>max){max=sum;}//如果有更多的点共线,则更新max。
}
}
printf("%d\n",max);
}
return 0;
}
#include<cstdio>
using namespace std;
struct node
{
int x,y;
}a[800];//用结构体记录点
int main()
{
int n;
int sum;
int max;
int i;
int j;
int k;
while(scanf("%d",&n)==1,n)
{
max=0;//记录最大点数
for(i=0;i<n;i++)
{
scanf("%d %d",&a[i].x,&a[i].y);
}
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
sum=2;//前面二重循环找到两个点,sum赋值2。
for(k=j+1;k<n;k++)//再找另一个点
{
if((double)(a[i].y-a[j].y)*(a[j].x-a[k].x)==(double)(a[j].y-a[k].y)*(a[i].x-a[j].x))//判断是否共线
{
sum++;//共线,数量+1
}
}
if(sum>max){max=sum;}//如果有更多的点共线,则更新max。
}
}
printf("%d\n",max);
}
return 0;
}