哈希 poj 2002

n个点

求其中有几个正方形

n<1000

暴力4个点就不行了

大概2个点还可以

根基(x*x+y*y)%素数 hash 一下

告诉你2个点求 另外2个点 画个图推一下

重复要/2;

 1 #include<stdio.h>
 2 #include<algorithm>
 3 #include<vector>
 4 
 5 using namespace std;
 6 
 7 #define mod 10007
 8 struct point
 9 {
10     int x,y;
11 
12 }x[1005];
13 
14 vector<point>hash[mod];
15 
16 void insert(int a)
17 {
18     int h=(x[a].x*x[a].x+x[a].y*x[a].y)%mod;
19     hash[h].push_back(x[a]);    
20 }
21 bool cmp(point a,point b)
22 {
23     if(a.x==b.x)
24         return a.y<b.y;
25     return a.x<b.x;
26 }
27 bool search(int a,int b)
28 {
29     int h=(a*a+b*b)%mod;
30     for(int i=0;i<hash[h].size();i++)
31     {
32         if(hash[h][i].x==a&&hash[h][i].y==b)
33         return true;
34     }
35     return false;
36 }
37 int main()
38 {
39     int n;
40     while(scanf("%d",&n)!=EOF&&n)
41     {
42         for(int i=0;i<mod;i++)
43             hash[i].clear();
44 
45         for(int i=1;i<=n;i++)
46         {
47             scanf("%d%d",&x[i].x,&x[i].y);
48             insert(i);        
49         }
50         int cnt=0;
51         sort(x+1,x+n+1,cmp);
52         for(int i=1;i<=n;i++)
53         {
54             for(int j=i+1;j<=n;j++)
55             {
56                 int x1,y1,x2,y2;
57                 x1=x[i].x-(x[j].y-x[i].y);
58                 y1=x[i].y+(x[j].x-x[i].x);
59                 x2=x[j].x-(x[j].y-x[i].y);
60                 y2=x[j].y+(x[j].x-x[i].x);
61                 if(search(x1,y1)&&search(x2,y2))
62                     cnt++;
63                 
64             }
65         }
66         printf("%d
",cnt/2);
67     }
68 
69     return 0;
70 }
原文地址:https://www.cnblogs.com/cherryMJY/p/6101030.html