POJ 2002 Squares

题目大意:

给出平面上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;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值