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

 

你可能感兴趣的:(poj)