poj 2002 Squares
题目链接:http://poj.org/problem?id=2002
A square is a 4-sided polygon whose sides have equal length and adjacent sides form 90-degree angles. It is also a polygon such that rotating about its centre by 90 degrees gives the same polygon. It is not the only polygon with the latter property, however, as a regular octagon also has this property.
So we all know what a square looks like, but can we find all possible squares that can be formed from a set of stars in a night sky? To make the problem easier, we will assume that the night sky is a 2-dimensional plane, and each star is specified by its x and y coordinates.
Input
Output
题意:二维平面给出一些点,计算以这些点为顶点的正方形的个数。
解法:哈希。因为n为1000,坐标大小高达20000,普通查找肯定不行的,我们得用哈希压缩坐标。
然后枚举正方形的一条边上的两个顶点,可以计算出剩余的两个顶点坐标,然后哈希表查找是否有这样的正方形,统计个数,然后除以4即可(因为枚举了每个正方形的每条边)。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<cmath> 6 #include<algorithm> 7 #define inf 0x7fffffff 8 using namespace std; 9 typedef long long ll; 10 const int maxn=1000+10; 11 const int mod=100007; 12 struct node 13 { 14 int x,y; 15 int next; 16 }edge[maxn]; 17 int head[mod],edgenum; 18 int xx[maxn],yy[maxn]; 19 void insert_hash(int x,int y) 20 { 21 int k=(x*x+y*y)%mod; 22 edge[edgenum].x=x ; 23 edge[edgenum].y=y ; 24 edge[edgenum].next=head[k] ; 25 head[k]=edgenum++ ; 26 } 27 int search_hash(int x,int y) 28 { 29 int k=(x*x+y*y)%mod; 30 for (int i=head[k] ;i!=-1 ;i=edge[i].next) 31 { 32 if (x==edge[i].x && y==edge[i].y) return true; 33 } 34 return false; 35 } 36 int main() 37 { 38 int n; 39 while (scanf("%d",&n)!=EOF && n) 40 { 41 memset(head,-1,sizeof(head)); 42 edgenum=0; 43 for (int i=0 ;i<n ;i++) 44 { 45 scanf("%d%d",&xx[i],&yy[i]); 46 insert_hash(xx[i],yy[i]); 47 } 48 int count=0; 49 for (int i=0 ;i<n ;i++) 50 { 51 for (int j=i+1 ;j<n ;j++) 52 { 53 int x=xx[i]+(yy[j]-yy[i]); 54 int y=yy[i]-(xx[j]-xx[i]); 55 int x2=xx[j]-(yy[i]-yy[j]); 56 int y2=yy[j]+(xx[i]-xx[j]); 57 if (search_hash(x,y) && search_hash(x2,y2)) count ++ ; 58 } 59 } 60 for (int i=0 ;i<n ;i++) 61 { 62 for (int j=i+1 ;j<n ;j++) 63 { 64 int x=xx[i]-(yy[j]-yy[i]); 65 int y=yy[i]+(xx[j]-xx[i]); 66 int x2=xx[j]+(yy[i]-yy[j]); 67 int y2=yy[j]-(xx[i]-xx[j]); 68 if (search_hash(x,y) && search_hash(x2,y2)) count ++ ; 69 } 70 } 71 printf("%d\n",count/4); 72 } 73 return 0; 74 }
后续:感谢大牛提出宝贵的意见。。。