poj 2002 Squares 几何二分 || 哈希

Squares
Time Limit: 3500MS   Memory Limit: 65536K
Total Submissions: 15137   Accepted: 5749

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

Source

 
 1 /*

 2 题意:给你1000个点的坐标(x,y),让你找出能

 3             构成正方形的个数。

 4 思路:由于是1000,则枚举两个点,求出相应的另外

 5 两个点的坐标。然后用二分判断是否两个点都存在。

 6 

 7 

 8 就个人而言,关键在  "求出相应的另外两个点的坐标"

 9 设两个点a1,a2;

10 由a1为中心,逆时针旋转求出

11 a3.x=a1.y-a2.y+a1.x;

12 a3.y=a2.x-a1.x+a1.y;

13 由a2为中心,顺时针旋转求出

14 a4.x=a1.y-a2.y+a2.x;

15 a4.y=a2.x-a1.x+a2.y;

16 由于被计算两次,所以除2

17 */

18 #include<iostream>

19 #include<stdio.h>

20 #include<cstring>

21 #include<cstdlib>

22 #include<algorithm>

23 using namespace std;

24 

25 typedef struct

26 {

27     int x,y;

28 }node;

29 node a[1003];

30 bool cmp(node n1,node n2)

31 {

32     if( n1.x!=n2.x )

33         return n1.x<n2.x;

34     else return n1.y<n2.y;

35 }

36 bool query(int l,int r,node cur)

37 {

38     int mid;

39     while(l<=r)

40     {

41         mid=(l+r)/2;

42         if( a[mid].x<cur.x || (a[mid].x==cur.x&&a[mid].y<cur.y))

43             l=mid+1;

44         else if( a[mid].x>cur.x || ( a[mid].x==cur.x&&a[mid].y>cur.y))

45             r=mid-1;

46         if( a[mid].x==cur.x && a[mid].y==cur.y) return true;

47     }

48     return false;

49 }

50 int main()

51 {

52     int n,i,j,num;

53     node a1,a2,a3,a4;

54     while(scanf("%d",&n)>0)

55     {

56         if(n==0)break;

57         for(i=1;i<=n;i++)

58             scanf("%d%d",&a[i].x,&a[i].y);

59         sort(a+1,a+1+n,cmp);

60 

61         for(i=1,num=0;i<n;i++)

62         {

63             a1=a[i];

64             for(j=i+1;j<=n;j++)

65             {

66                 a2=a[j];

67                 a3.x=a1.y-a2.y+a1.x;

68                 a3.y=a2.x-a1.x+a1.y;

69                 if( !query(1,n,a3)) continue;

70                 a4.x=a1.y-a2.y+a2.x;

71                 a4.y=a2.x-a1.x+a2.y;

72                 if( query(1,n,a4)) num++;

73 

74             }

75         }

76         printf("%d\n",num/2);

77     }

78     return 0;

79 }

 

哈希做法:

 1 #include<iostream>

 2 #include<stdio.h>

 3 #include<cstring>

 4 #include<cstdlib>

 5 #include<algorithm>

 6 using namespace std;

 7 

 8 const int INF = 1000;

 9 typedef struct

10 {

11     int x,y;

12 }node;

13 struct hash

14 {

15     int x;

16     int y;

17     struct hash *next;

18 };

19 struct hash hash_table[1003];

20 node a[INF+3];

21 

22 bool cmp(node n1,node n2)

23 {

24     if( n1.x!=n2.x )

25         return n1.x<n2.x;

26     else return n1.y<n2.y;

27 }

28 void Insert(int x,int y)

29 {

30     unsigned k=(x*x+y*y)%INF;

31     struct hash *new_hash;

32     new_hash=(struct hash *)malloc(sizeof(struct hash));

33     new_hash->x=x;

34     new_hash->y=y;//build 

35 

36     new_hash->next=hash_table[k].next;

37     hash_table[k].next=new_hash;

38 }

39 bool found(int x,int y)

40 {

41     unsigned k=(x*x+y*y)%INF;

42     struct hash *new_hash;

43     new_hash=hash_table[k].next;

44     while(new_hash!=NULL)

45     {

46         if(new_hash->x==x && new_hash->y==y)break;

47         else new_hash=new_hash->next;

48     }

49     if(new_hash==NULL)return false;

50     else return true;

51 }

52 

53 int main()

54 {

55     int n,i,j,num;

56     node a1,a2,a3,a4;

57     while(scanf("%d",&n)>0)

58     {

59         if(n==0)break;

60         memset(hash_table,0,sizeof(hash_table));

61         for(i=1;i<=n;i++)

62         {

63             scanf("%d%d",&a[i].x,&a[i].y);

64             Insert(a[i].x,a[i].y);

65         }

66         sort(a+1,a+1+n,cmp);

67 

68         for(i=1,num=0;i<n;i++)

69         {

70             a1=a[i];

71             for(j=i+1;j<=n;j++)

72             {

73                 a2=a[j];

74                 a3.x=a1.y-a2.y+a1.x;

75                 a3.y=a2.x-a1.x+a1.y;

76                 if(!found(a3.x,a3.y))continue;

77                 a4.x=a1.y-a2.y+a2.x;

78                 a4.y=a2.x-a1.x+a2.y;

79                 if(found(a4.x,a4.y)==true)

80                     num++;

81             }

82         }

83         printf("%d\n",num/2);

84     }

85     return 0;

86 }

 

你可能感兴趣的:(poj)