poj2002(Squares)

题目地址:Squares

 

题目大意;

     给你N个坐标顶点,通过连接各个顶点,构成正方形,问最多有多少个正方形。通过不同的顺序构成的正方形视为同一正方形。

 

解题思路:

    O(n^4)超时。这时想通过两个坐标顶点是否可以查找是否构成正方形。

通过三角形全等得:

已知: (x1,y1)  (x2,y2)

则:  

    x3=x1+(y1-y2)   y3= y1-(x1-x2)

    x4=x2+(y1-y2)   y4= y2-(x1-x2)

    x3=x1-(y1-y2)   y3= y1+(x1-x2)

    x4=x2-(y1-y2)   y4= y2+(x1-x2)

通过两个坐标可以确定另外两个坐标。以为属于枚举了四个顶点,所以最后结果应该除以4.

通过hash 将各个顶点存起来。  然后通过x1,x2,y1,y2计算出的x3,y3,x4,y4分别去判断已经存起来的顶点是否存在,如存在即可以构成。

代码1:

Memory: 540K   Time: 1329MS

 

链表模拟拉链。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 struct no
 8 {
 9     int x;
10     int y;
11 } node[1001];
12 struct map
13 {
14     int x;
15     int y;
16     struct map *next;
17 } *m[2010];
18 int hash1(int x,int y)
19 {
20     int key=(x*x+y*y)%2000;
21     if (!m[key])
22     {
23         map *temp=(map *)malloc(sizeof(map));
24         temp->x=x;
25         temp->y=y;
26         temp->next=NULL;
27         m[key]=temp;
28     }
29     else
30     {
31         map *temp=m[key];
32         while(temp)
33             temp=temp->next;
34         temp=(map *)malloc(sizeof(map));
35         temp->x=x;
36         temp->y=y;
37         temp->next=NULL;
38     }
39 }
40 int find(int x,int y)
41 {
42     int key=(x*x+y*y)%2000;
43     if (m[key])
44     {
45         map *temp=m[key];
46         while(temp)
47         {
48             if (temp->x==x&&temp->y==y)
49                 return 1;
50             temp=temp->next;
51         }
52     }
53     return 0;
54 }
55 int main()
56 {
57     int n;
58     while(scanf("%d",&n)&&n)
59     {
60         int i,j,x3,y3,x4,y4,cas=0;
61         memset(m,0,sizeof(m));
62         for(i=0; i<n; i++)
63         {
64             scanf("%d%d",&node[i].x,&node[i].y);
65             hash1(node[i].x,node[i].y);
66         }
67         /*
68            (x1,y1)  (x2,y2)
69            x3=x1+(y1-y2)   y3= y1-(x1-x2)
70            x4=x2+(y1-y2)   y4= y2-(x1-x2)
71            x3=x1-(y1-y2)   y3= y1+(x1-x2)
72            x4=x2-(y1-y2)   y4= y2+(x1-x2)*/
73         for(i=0; i<n; i++)
74             for(j=0; j<n; j++)
75             {
76                 if (j==i)
77                     continue;
78                  x3=node[i].x+(node[j].y-node[i].y);
79                  y3=node[i].y-(node[j].x-node[i].x);
80                  x4=node[j].x+(node[j].y-node[i].y);
81                  y4=node[j].y-(node[j].x-node[i].x);
82                  if (find(x3,y3)&&find(x4,y4))
83                      cas++;
84                  x3=node[i].x-(node[j].y-node[i].y);
85                  y3=node[i].y+(node[j].x-node[i].x);
86                  x4=node[j].x-(node[j].y-node[i].y);
87                  y4=node[j].y+(node[j].x-node[i].x);
88                  if (find(x3,y3)&&find(x4,y4))
89                      cas++;
90             }
91         printf("%d\n",cas/4);
92     }
93     return 0;
94 }
View Code

代码2:

Memory: 180K   Time: 891MS

 

数组模拟拉链。

  1 #include <algorithm>
  2 #include <iostream>
  3 #include <sstream>
  4 #include <cstdlib>
  5 #include <cstring>
  6 #include <cstdio>
  7 #include <string>
  8 #include <bitset>
  9 #include <vector>
 10 #include <queue>
 11 #include <stack>
 12 #include <cmath>
 13 #include <list>
 14 //#include <map>
 15 #include <set>
 16 using namespace std;
 17 /***************************************/
 18 #define ll long long
 19 #define int64 __int64
 20 /***************************************/
 21 const int INF = 0x7f7f7f7f;
 22 const double eps = 1e-8;
 23 const double PIE=acos(-1.0);
 24 const int d1x[]= {0,-1,0,1};
 25 const int d1y[]= {-1,0,1,0};
 26 const int d2x[]= {0,-1,0,1};
 27 const int d2y[]= {1,0,-1,0};
 28 const int fx[]= {-1,-1,-1,0,0,1,1,1};
 29 const int fy[]= {-1,0,1,-1,1,-1,0,1};
 30 /*vector <int>map[N];map[a].push_back(b);int len=map[v].size();*/
 31 /***************************************/
 32 void openfile()
 33 {
 34     freopen("data.in","rb",stdin);
 35     freopen("data.out","wb",stdout);
 36 }
 37 /**********************华丽丽的分割线,以上为模板部分*****************/
 38 struct Node
 39 {
 40     int x,y;
 41 } node[1001];
 42 const int M=1999;
 43 int hash[2000],next[2000];
 44 int hashcode(int x,int y)
 45 {
 46     int p=0;
 47     p=(p<<6)+(x>>6)^(x<<6);
 48     p=(p<<6)+(y>>6)^(y<<6);
 49     p%=M;
 50     if (p<0)
 51         p+=M;
 52     return p;
 53 }
 54 int cmp(int x,int y)
 55 {
 56     int p;
 57     int h=hashcode(x,y);
 58     for(p=hash[h]; p!=-1; p=next[p])
 59         if (node[p].x==x&&node[p].y==y)
 60             return 1;
 61     return 0;
 62 }
 63 int main()
 64 {
 65     int n;
 66     while(scanf("%d",&n)&&n)
 67     {
 68         int i,j;
 69         int x1,x2,x3,x4,y1,y2,y3,y4;
 70         memset(hash,-1,sizeof(hash));
 71         for(i=0; i<n; i++)
 72         {
 73             scanf("%d%d",&node[i].x,&node[i].y);
 74             int h=hashcode(node[i].x,node[i].y);
 75             next[i]=hash[h];
 76             hash[h]=i;
 77         }
 78         int cnt=0;
 79         for(i=0; i<n; i++)
 80         {
 81             for(j=i+1; j<n; j++)
 82             {
 83                 x1=node[i].x;
 84                 x2=node[j].x;
 85                 y1=node[i].y;
 86                 y2=node[j].y;
 87                 x3=x1+(y1-y2);
 88                 y3=y1-(x1-x2);
 89                 x4=x2+(y1-y2);
 90                 y4=y2-(x1-x2);
 91                 if (cmp(x3,y3)&&cmp(x4,y4))
 92                     cnt++;
 93                 x3=x1-(y1-y2);
 94                 y3=y1+(x1-x2);
 95                 x4=x2-(y1-y2);
 96                 y4=y2+(x1-x2);
 97                 if (cmp(x3,y3)&&cmp(x4,y4))
 98                     cnt++;
 99             }
100         }
101         printf("%d\n",cnt/4);
102      }
103      return 0;
104 }
View Code
posted @ 2014-07-25 10:15  kinghold  Views(152)  Comments(0Edit  收藏  举报