给出一系列坐标,求在一直线上的点,最多有多少个?
算法:枚举
这里用了对组和结构体两种不同的数据类型解,感觉结构体好一些,对组的first和second写起来太长了,没有x,y直观。
#include <iostream>
#include <cstdio>
using namespace std;
pair< int , int > p[ 705 ];
int main ()
{
int n;
while ( cin>> n)
{
if (! n) break ;
for ( int i= 0 ; i< n; i++)
cin>> p[ i]. first>> p[ i]. second;
;
int max= 0 , cnt;
for ( int i= 0 ; i< n; i++)
for ( int j= i+1 ; j< n; j++)
{
cnt= 0 ;
for ( int k= j+1 ; k< n; k++)
{
int a=( p[ i]. first- p[ j]. first)*( p[ j]. second- p[ k]. second);
int b=( p[ i]. second- p[ j]. second)*( p[ j]. first- p[ k]. first);
if ( a== b) cnt++;
}
max= max> cnt? max: cnt;
}
;
cout<< max+2 << endl;
}
return 0 ;
}
#include <iostream>
#include <cstdio>
using namespace std;
struct point
{
int x, y;
} ;
point p[ 705 ];
int main ()
{
int n;
while ( cin>> n)
{
if (! n) break ;
for ( int i= 0 ; i< n; i++)
cin>> p[ i]. x>> p[ i]. y;
;
int max= 0 , cnt;
for ( int i= 0 ; i< n; i++)
for ( int j= i+1 ; j< n; j++)
{
cnt= 0 ;
for ( int k= j+1 ; k< n; k++)
{
int a=( p[ i]. x- p[ j]. x)*( p[ j]. y- p[ k]. y);
int b=( p[ i]. y- p[ j]. y)*( p[ j]. x- p[ k]. x);
if ( a== b) cnt++;
}
max= max> cnt? max: cnt;
}
;
cout<< max+2 << endl;
}
return 0 ;
}
和1118几乎一模一样的2606,结束输出的条件不一样而已
1118结束条件: 0 0
2606结束条件: EOF
顺便附上2606的代码:
#include <iostream>
#include <cstdio>
using namespace std;
pair < int , int > p[ 705 ];
int main ()
{
int n;
while (~ scanf ( "%d" ,& n))
{
for ( int i= 0 ; i< n; i++)
cin>> p[ i]. first>> p[ i]. second;
;
int cnt, max= 0 ;
for ( int i= 0 ; i< n; i++)
for ( int j= i+1 ; j< n; j++) {
cnt= 0 ;
for ( int k= j+1 ; k< n; k++)
{
int a=( p[ i]. first- p[ k]. first)*( p[ j]. second- p[ k]. second);
int b=( p[ j]. first- p[ k]. first)*( p[ i]. second- p[ k]. second);
if ( a== b) cnt++;
}
max= max> cnt? max: cnt;
}
;
cout<< max+2 << endl;
}
return 0 ;
}