POJ 2002 Squares 哈希

题目链接: http://poj.org/problem?id=2002

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 const int prime = 999983;
 5 
 6 struct Hash_table
 7 {
 8     int x, y;
 9     struct Hash_table *next;
10 }*Hash[prime];
11 
12 void Hash_insert(int x, int y)
13 {
14     int key = (x + y) % prime;
15     if(Hash[key] == NULL)
16     {
17         Hash[key] = new Hash_table;
18         Hash[key]->x = x;
19         Hash[key]->y = y;
20         Hash[key]->next = NULL;
21         return;
22     }
23     struct Hash_table *p = Hash[key];
24     
25     //必须注意!下面几行一定是p->next,如果改成:
26     /*
27     while(p != NULL)
28         p = p->next;
29     p = new Hash_table;
30     p->x = x;
31     p->y = y;
32     p->next = NULL;
33     */
34     //是绝对不行的,因为这里调试了半天了。。。。。。
35     //正解如下:
36     while(p->next != NULL)
37         p = p->next;
38     p->next = new Hash_table;
39     p->next->x = x;
40     p->next->y = y;
41     p->next->next = NULL;
42 }
43 
44 bool Hash_search(int x, int y)
45 {
46     int key = (x + y) % prime;
47     struct Hash_table *p = Hash[key];
48     while(p != NULL)
49     {
50         if(p->x == x && p->y == y)
51             return 1;
52         p = p->next;
53     }
54     return 0;
55 }
56 
57 int main()
58 {
59     int n, tx, ty, x[1010], y[1010];
60     int x3, x4, y3, y4;
61     while(scanf("%d", &n) != EOF && n)
62     {
63         memset(Hash, 0, sizeof(Hash));
64         for(int i = 0; i < n; i++)
65         {
66             scanf("%d %d", &tx, &ty);
67             x[i] = tx + 20000;
68             y[i] = ty + 20000;
69             Hash_insert(x[i], y[i]);
70         }
71         int ans = 0;
72         for(int i = 0; i < n; i++)
73         {
74             for(int j = 0; j < n; j++)
75             {
76                 if(j == i)continue;
77                 x3 = x[i]+(y[i]-y[j]);
78                 y3 = y[i]-(x[i]-x[j]);
79                 x4 = x[j]+(y[i]-y[j]);
80                 y4 = y[j]-(x[i]-x[j]);
81                 if(Hash_search(x3, y3) && Hash_search(x4, y4))
82                     ans++;
83             }
84         }
85         printf("%d\n", ans/4);
86     }
87     return 0;
88 }
View Code

 

posted @ 2013-08-15 15:36  Anti-Magic  阅读(185)  评论(0编辑  收藏  举报