Squares 四边形数量,求坐标很重要

Problem 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. 
 

 

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
***************************************************************************************************************************
记着标记数组要用boolean类型
***************************************************************************************************************************
 1 #include<iostream>
 2 #include<string>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<queue>
 6 #include<cstdio>
 7 using namespace std;
 8 int x[1010],y[1010];
 9 bool fs[5000][5000];//此处要定义成bool类型的,否则超内存
10 int a,b,c,i,j,sum,n;
11 int f(int a,int b)
12 {
13       if(fs[a+2500][b+2500])
14          return 1;
15      return 0;
16 }
17 
18 int main()
19 {
20     int x1,y1,x2,y2,x3,y3,x4,y4;
21     int a,b,i,j,sum,n;
22     while(scanf("%d",&n)&&n)
23     {
24         sum=0;
25         memset(fs,0,sizeof(fs));
26         for(i=0;i<n;i++)
27         {
28             scanf("%d %d",&a,&b);
29             x[i]=a;
30             y[i]=b;
31             fs[a+2500][b+2500]=1;
32         }
33         for(i=0;i<n;i++)
34         {
35              x1=x[i];
36              y1=y[i];
37             for(j=0;j<i;j++)
38             {
39                  x2=x[j];
40                  y2=y[j];
41                  x3,y3,x4,y4;
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                 x3=x1-(y1-y2);
49                 y3=y1+(x1-x2);
50                 x4=x2-(y1-y2);
51                 y4=y2+(x1-x2);
52                 if(f(x3,y3)&&f(x4,y4))
53                   sum++;
54             }
55         }
56         printf("%d\n",sum/4);//注意此处要除以4,
57 
58     }
59 }
View Code

 

posted @ 2013-10-26 13:03  persistent codeants  阅读(228)  评论(0编辑  收藏  举报