题目描述
On a two-dimensional plane, give you n integer points. Your task is to figure out how many different regular polygon these points can make.
输入
The input file consists of several test cases. Each case the first line is a numbers N (N <= 500). The next N lines ,each line contain two number Xi and Yi(-100 <= xi,yi <= 100), means the points’ position.(the data assures no two points share the same position.)
输出
For each case, output a number means how many different regular polygon these points can make.
样例输入
4
0 0
0 1
1 0
1 1
6
0 0
0 1
1 0
1 1
2 0
2 1
样例输出
1
2
首先你要知道,整点构成的多边形只能为正方形(杨景钦2017年国家队论文有介绍),进而题目优化为找整点所构成的正方形,根据相邻的任意两点找另外两个点,把所有的点都统计一遍,所以最后的结果除4.
以(x,y)去找(x1(x2),y1(y2));分为这两种情况。
具体代码:
#include<iostream>
#include<bits/stdc++.h>
struct coor{
int x,y;
}p[501];
int main()
{
int n;
int t[502][502];
while(scanf("%d",&n)!=EOF)
{
memset(t,0,sizeof(t));
for(int i=0;i<n;i++)
{
scanf("%d%d",&p[i].x,&p[i].y);
p[i].x=p[i].x+200;
p[i].y=p[i].y+200;
t[p[i].x][p[i].y]=1;
}
int ans=0;
for(int i=0;i<n;i++)
{
for(int j=1+i;j<n;j++)
{
coor a = p[i];coor b = p[j];
int dx = a.x-b.x;
int dy = a.y-b.y;
if (a.x+dy>=0&&a.y-dx>=0&&b.y-dx>=0&&b.x+dy>=0&&t[a.x+dy][a.y-dx]&&t[b.x+dy][b.y-dx]){
ans++;
}
if (a.x-dy>=0&&a.y+dx>=0&&b.y+dx>=0&&b.x-dy>=0&&t[a.x-dy][a.y+dx]&&t[b.x-dy][b.y+dx]){
ans++;
}
}
}
printf("%d\n",ans/4);
}
return 0;
}