您的位置:首页 > 其它

POJ 2002 Squares

2013-03-23 11:13 197 查看
题目大意:

给出平面上n (1 <= n <= 1000)个点,问以它们为顶点能组成多少个正方形?

思路分析:hash

每次枚举正方形两个相邻的点,计算出另外两个点,然后用Hash判断是否存在即可~

这里有篇写的很详细的解题报告,不了解hash的可以去看看

载请注明出处:優YoU http://user.qzone.qq.com/289065406/blog/1304779855

我这里解决冲突并不是用的链地址法,而是通过数组来实现,不过用指针的话时间效率上的确会快一些

代码

#include<stdio.h>
#define prime 99991

struct point{
int x,y;
}p[1010],hashp[100000];

int hash[100000];

int find(int x,int y)
{
int c;
c=(x*x+y*y)%prime;
if (hash[c]==0) return 0;
else
{
while ((hashp[c].x!=x||hashp[c].y!=y)&&(hash[c]!=0)) c=(c+1)%prime;
if (hash[c]==0) return 0;
else return 1;
}
}

int main()
{
int n,i,j,x1,x2,y1,y2,s;
while (scanf("%d",&n),n!=0){
s=0;
memset(hash,0,sizeof(hash));
for (i=1;i<=n;i++)
{
scanf("%d%d",&p[i].x,&p[i].y);
j=((p[i].x*p[i].x)+(p[i].y*p[i].y))%prime;
while (hash[j]!=0) j=(j+1)%prime;
hash[j]=1;
hashp[j].x=p[i].x;
hashp[j].y=p[i].y;
}
for (i=1;i<=n;i++)
for (j=i+1;j<=n;j++)
{
x1=p[i].x+p[i].y-p[j].y;
y1=p[i].y-p[i].x+p[j].x;
x2=p[j].x+p[i].y-p[j].y;
y2=p[j].y-p[i].x+p[j].x;
if (find(x1,y1)&&find(x2,y2)) s++;
x1=p[i].x-p[i].y+p[j].y;
y1=p[i].y+p[i].x-p[j].x;
x2=p[j].x-p[i].y+p[j].y;
y2=p[j].y+p[i].x-p[j].x;
if (find(x1,y1)&&find(x2,y2)) s++;
}
printf("%d\n",s/4);}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: