acm pku 1118 Lining Up的具體實現方法

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章