Rabbit hunt
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 8137 | Accepted: 4058 |
Description
A good hunter kills two rabbits with one shot. Of course, it can be easily done since for any two points we can always draw a line containing the both. But killing three or more rabbits in one shot is much more difficult task. To be the best hunter in the world
one should be able to kill the maximal possible number of rabbits. Assume that rabbit is a point on the plane with integer x and y coordinates. Having a set of rabbits you are to find the largest number K of rabbits that can be killed with single shot, i.e.
maximum number of points lying exactly on the same line. No two rabbits sit at one point.
Input
An input contains an integer N (2<=N<=200) specifying the number of rabbits. Each of the next N lines in the input contains the x coordinate and the y coordinate (in this order) separated by a space (-1000<=x,y<=1000).
Output
The output contains the maximal number K of rabbits situated in one line.
Sample Input
6 7 122 8 139 9 156 10 173 11 190 -100 1
Sample Output5
2
思想:两个点 连成直线,再判断第三个点是否在该直线上
#include <iostream>
#include <cstdio>
using namespace std;
#define N 1000
#define up(i,a,b) for(int i=a;i<=b;i++)//定义一个循环
struct node{
int x,y;
};
int main(int argc, const char * argv[]) {
int max=0;
int n;
cin>>n;
node t[n];
int i=0;
up(i,0,n-1)
scanf("%d %d",&t[i].x,&t[i].y);
for(i=0;i<n;i++)//三个点里的第一个点
for(int j=i+1;j<n;j++)//三个点里的第二个点
{
int sum=0;
for(int k=j+1;k<n;k++)//三个点里的第三个点
{
if((t[i].y-t[j].y)*(t[i].x-t[k].x)==(t[i].y-t[k].y)*(t[i].x-t[j].x))//斜率相等
sum++;
}
if(sum>max)
max=sum;
}
cout<<max+2<<endl;//注意要换行
return 0;
}