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;
}
執行結果: