假装这里有题目。
题意大概就是给你一些整数点集,然后判断里面有多少正多边形。因为一定是整数,所以必定只有正方形,然后锁定两个点,可以知道其他两个点可能的位置,然后去搜索这两个点存不存在就好了,要预处理一下,排个序,然后二分就好了。
唯一搞不明白的是这个题为什么是poj2002.。。。。
#include<bits/stdc++.h>
using namespace std;
const int maxn=550;
struct bbq
{
int x,y;
};
bbq p[maxn];
bool cmp(bbq x,bbq y)
{
if(x.x<y.x)
return 1;
else if(x.x==y.x&&x.y<y.y)
return 1;
else return 0;
}
int n;
int serch(int x, int y)
{
int m, s, t;
s = 0;
t = n-1;
while (s <= t) {
m = (s+t)/2;
if (p[m].x == x && p[m].y == y) return 1;
if (p[m].x > x || (p[m].x == x && p[m].y > y)) {
t = m-1;
}
else {
s = m+1;
}
}
return 0;
}
int main()
{
int x,y;
while(~scanf("%d",&n))
{
memset(p,0,sizeof p);
int mount=0;
for(int i=0; i<n; i++)
scanf("%d %d",&p[i].x,&p[i].y);
sort(p,p+n,cmp);
for(int i=0; i<n; i++)
for(int j=(i+1); j<n; j++)
{
x=p[i].y-p[j].y+p[i].x;
y=p[j].x-p[i].x+p[i].y;
if (serch(x,y) == 0)
{
continue;
}
x = p[i].y-p[j].y+p[j].x;
y = p[j].x-p[i].x+p[j].y;
if (serch(x,y)) {
mount++;
}
}
printf("%d\n",mount/2);
}
}