您的位置:首页 > 其它

poj1118(水题)

2013-05-30 10:51 225 查看
Lining Up

Time Limit: 2000MSMemory Limit: 32768K
Total Submissions: 17895Accepted: 5692
Description

"How am I ever going
to solve this problem?" said the pilot.

Indeed, the pilot was not facing an easy task. She had to drop
packages at specific points scattered in a dangerous area.
Furthermore, the pilot could only fly over the area once in a
straight line, and she had to fly over as many points as possible.
All points were given by means of integer coordinates in a
two-dimensional space. The pilot wanted to know the largest number
of points from the given set that all lie on one line. Can you
write a program that calculates this number?

Your program has to be efficient!

Input

Input consist
several case,First line of the each case is an integer N ( 1
< N < 700 ),then follow N pairs of
integers. Each pair of integers is separated by one blank and ended
by a new-line character. The input ended by N=0.
Output

output one integer
for each input case ,representing the largest number of points that
all lie on one line.
Sample Input

5
1 1
2 2
3 3
9 10
10 11
0

Sample Output

3

Source

East Central North America 1994
http://poj.org/problem?id=1118

这题关键是如何判断几个点在同一条直线上。。可以通过斜率相等来判断
:(yi-yk)/(xi-xk)=(yj-yk)/(xj-xk),除法不能出现分母为0的情况,所以转换为乘法做,即:(yi-yk)*(xj-xk)=(yj-yk)*(xi-xk)(i、j、k共线)。
这样就简单了。。


#include<stdio.h>

typedef struct

{

int x;

int y;

}Node;

Node coor[1001];

int main()

{

int n;

while(scanf("%d",&n),n)

{

int i,j,k;

int max=0;

for(i=0;i<n;i++)

scanf("%d
%d",&coor[i].x,&coor[i].y);

for(i=0;i<n;i++)

{

for(j=i+1;j<n;j++)

{

int
temp=2;//这边要理解,任意给定n(n>=2)个点,至少2个点共线

for(k=j+1;k<n;k++)

{

if((coor[k].y-coor[i].y)*(coor[j].x-coor[i].x
)==(coor[k].x-coor[i].x)*(coor[j].y-coor[i].y ))

temp++;

}

if(temp>max)

max=temp;

}

}

printf("%d\n",max);

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: