POJ 2002 Squares
这题的题意是这样的:
有一堆平面散点集,任取四个点,求能组成正方形的不同组合方式有多少。
相同的四个点,不同顺序构成的正方形视为同一正方形。
解题思想:建立点的哈希表,枚举任意两点,计算出符合条件的其余两点,在哈希表中寻找,找到计数加一,因为不同序列构成的视为同一个正方形,最后计数需除以四再输出。
下面是代码:
#include <stdio.h> #include <string.h> struct po { int x,y; } point[1005]; struct node { struct po poi[1005]; } hash1[40005],hash2[40005]; int head1[40005],head2[40005]; bool search (int x, int y) { int i,sum=x+y; if(sum>=0) { for(i=0; i<head1[sum]; i++) { if(hash1[sum].poi[i].x==x&&hash1[sum].poi[i].y==y) { return true; } } } else { sum*=-1; for(i=0; i<head2[sum]; i++) { if(hash2[sum].poi[i].x==x&&hash2[sum].poi[i].y==y) { return true; } } } return false; } int main() { int n; while(scanf("%d",&n),n) { int i,sum; memset(head1,0,sizeof(head1)); memset(head2,0,sizeof(head2)); for(i=0; i<n; i++) { scanf("%d%d",&point[i].x,&point[i].y); sum=point[i].x+point[i].y; if(sum>=0) { hash1[sum].poi[head1[sum]].x=point[i].x; hash1[sum].poi[head1[sum]].y=point[i].y; head1[sum]++; } else { sum*=-1; hash2[sum].poi[head2[sum]].x=point[i].x; hash2[sum].poi[head2[sum]].y=point[i].y; head2[sum]++; } } int x1, y1, x2, y2, ans = 0,j; for (i = 0; i < n; i++) { for (j = i + 1; j < n; j++) { if (i == j) { continue; } x1 = point[i].x + point[i].y - point[j].y; y1 = point[i].y - point[i].x + point[j].x; x2 = point[j].x + point[i].y - point[j].y; y2 = point[j].y - point[i].x + point[j].x; if (search(x1, y1) && search(x2, y2)) { ans++; } x1 = point[i].x - point[i].y + point[j].y; y1 = point[i].y + point[i].x - point[j].x; x2 = point[j].x - point[i].y + point[j].y; y2 = point[j].y + point[i].x - point[j].x; if (search(x1, y1) && search(x2, y2)) { ans++; } } } printf("%d\n",ans/4); } return 0; }