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
5
1 1
2 2
3 3
9 10
10 11
0
Sample Output
3
Source
East Central North America 1994
很直观的问题,就是要找到在同一条直线上点最多的情况,并输出这些点的个数。可以通过求斜率来判断不同的点是否在同一条直线上。事实上,由于输入数据是int型的,因此,若两点的横坐标不等,则它们之间的差至少要大于等于1,因此在处理直线的斜率时,不需要进行特别处理。如果输入数据变为了double型,则问题又要复杂一些了。
具体实现:
#include "iostream"
#include "math.h"
using namespace std;
const int N = 700;
double itg[N][2];
double dAngle[N];
int cmp(const void *a, const void *b)
{
return (*(double*)a > *(double*)b) ? -1:1;
}
int LargestNum(int n)
{
int i, j, index;
int tmp, max, result = 1;
for(i = 0; i < n; i++)
{
index = 0;
memset(dAngle, 0, sizeof(double)*N);
for(j = i+1; j < n; j++)
{
if(itg[i][0] == itg[j][0]) dAngle[index] = 0;
else dAngle[index] = (itg[i][1] - itg[j][1])/(itg[i][0] - itg[j][0]);
index++ ;
}
qsort(dAngle, index, sizeof(double), cmp);
max = 2;
tmp = 2;
for(j = 0; j < index-1; j++)
{
if(dAngle[j] == dAngle[j+1])
{
tmp++ ;
if(tmp > max) max = tmp;
}
else tmp = 2;
}
if(result < max) result = max;
}
return result;
}
int main(void)
{
int n;
int i;
cin >> n;
while(n != 0)
{
for(i = 0; i < n; i ++)
cin >> itg[i][0] >> itg[i][1];
cout << LargestNum(n) << endl;
cin >> n;
}
return 0;
}
执行结果:
Problem: 1118 |
|
User: uestcshe |
Memory: 220K |
|
Time: 360MS |
Language: C++ |
|
Result: Accepted |