哈希 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\n",cnt/2); 67 } 68 69 return 0; 70 }
posted on 2016-11-25 11:51 HelloWorld!--By-MJY 阅读(118) 评论(0) 编辑 收藏 举报