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

 

你可能感兴趣的:(acm pku 1118 Lining Up的具体实现方法)