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
我这里解决冲突并不是用的链地址法,而是通过数组来实现,不过用指针的话时间效率上的确会快一些
代码
给出平面上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; }
相关文章推荐
- poj 2002 Squares(hash)
- POJ2002 Squares(枚举)
- poj 2002 Squares (hash 拉链 点集)
- poj-2002 Squares
- POJ-2002 Squares 解题报告
- [POJ2002]Squares【平面几何】
- Poj 2002 Squares
- POJ 2002 Squares
- poj 2002 Squares
- poj 2002 Squares
- poj 2002 Squares
- POJ 2002 Squares
- poj2002 Squares
- 【二分查找】-POJ-2002-Squares
- POJ 2002--Squares
- POJ 2002, Squares
- Hash poj2002 Squares
- [POJ2002]Squares(计算几何,二分)
- POJ 2002-Squares(hash拉链法-正方形个数)
- poj 2002 Squares