给出一系列坐标,求在一直线上的点,最多有多少个?
算法:枚举
这里用了对组和结构体两种不同的数据类型解,感觉结构体好一些,对组的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;
}