poj1118(水题)
2013-05-30 10:51
225 查看
Lining Up
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
Sample Output
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;
}
Time Limit: 2000MS | Memory Limit: 32768K | |
Total Submissions: 17895 | Accepted: 5692 |
"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;
}
相关文章推荐
- POJ1118 HDU1432 Lining Up【水题】
- POJ 1118与2606 (水题)
- POJ 1118 Lining Up 水题一道
- poj 1118 Lining Up(水题)
- POJ 1118 Lining Up(我的水题之路——斜率最多)
- poj 1118 Lining Up(水题)
- HDU 1432 Lining Up (POJ 1118)
- poj 1068 模拟水题
- POJ 2080Calendar (求日期水题)
- POJ-1573 Robot Motion 模拟水题
- POJ 1979 搜索 水题
- poj 2304/3032 水题(时钟转动/扑克排序)
- poj 3615(floyd变形 水题)
- POJ 1504 (一个水题引发的血案)
- POJ水题1008Maya Calendar
- POJ 2488 DFS水题
- POJ 1118 Lining Up
- poj 1213 How Many Tables 并查集水题
- POJ1003 水题不解释
- poj 3364 水题