Description
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.
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
The input consists of a number of test cases. Each test case starts with the integer n (1 <= n <= 1000) indicating the number of points to follow. Each of the next n lines specify the x and y coordinates (two integers) of each point. You may assume that the points are distinct and the magnitudes of the coordinates are less than 20000. The input is terminated when n = 0.
Output
For each test case, print on a line the number of squares one can form from the given stars.
Sample Input
4 1 0 0 1 1 1 0 0 9 0 0 1 0 2 0 0 2 1 2 2 2 0 1 1 1 2 1 4 -2 5 3 7 0 0 5 2 0
Sample Output
1 6 1
就是看看给出的点能组成几个正方形;
不要四个四个的组合,想也会超时,任意两个组合,然后计算出另外两个点;
再去查询是否存在;结果要除以4的;
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 using namespace std; 5 bool x[5000][5000];//我才不告诉你其实数据是-2000--2000 6 int si[1010],sj[1010]; 7 int f(int a,int b) 8 { 9 if(x[a+2500][b+2500]) 10 return 1; 11 return 0; 12 } 13 int main() 14 { 15 int a,b,i,j,n,sum; 16 int x1,y1,x2,y2,x3,y3,x4,y4; 17 while(scanf("%d",&n)&&n) 18 { 19 sum=0; 20 memset(x,0,sizeof(x)); 21 for(i=0; i<n; i++) 22 { 23 scanf("%d %d",&a,&b); 24 si[i]=a; 25 sj[i]=b; 26 x[a+2500][b+2500]=1; 27 } 28 for(i=1; i<n; i++) 29 { 30 x1=si[i]; 31 y1=sj[i]; 32 for(j=0; j<i; j++) 33 { 34 x2=si[j]; 35 y2=sj[j]; 36 x3=x1+(y1-y2);//计算剩下两个点 37 y3= y1-(x1-x2); 38 x4=x2+(y1-y2); 39 y4= y2-(x1-x2); 40 if(f(x3,y3)&&f(x4,y4)) 41 sum++; 42 x3=x1-(y1-y2); 43 y3= y1+(x1-x2); 44 x4=x2-(y1-y2); 45 y4= y2+(x1-x2); 46 if(f(x3,y3)&&f(x4,y4)) 47 sum++; 48 } 49 } 50 printf("%d ",sum/4);//记得除以4 51 } 52 return 0; 53 }