C++-POJ1021-2D-Nim[hash]

哈希,对于每个点哈希一次

哈希的方式:该点到联通分量边界(上下左右)的距离和

然后分别对两个图的n个点按hash值排序,判断是否相等即可

 1 #include <set>
 2 #include <map>
 3 #include <cmath>
 4 #include <queue>
 5 #include <vector>
 6 #include <cstdio>
 7 #include <cstdlib>
 8 #include <cstring>
 9 #include <iostream>
10 #include <algorithm>
11 using namespace std;
12 struct point{int x,y;}p[10001];
13 int T,W,H,n,flag,a[100][100],hash[2][10001];
14 int main(){
15     for(scanf("%d",&T);T--;){
16         scanf("%d%d%d",&W,&H,&n);
17         memset(hash,0,sizeof(hash));
18         for(int c=0;c<=1;c++){
19             memset(a,0,sizeof(a));
20             for(int i=1;i<=n;i++)scanf("%d%d",&p[i].x,&p[i].y),a[p[i].x][p[i].y]=1;
21             for(int i=1;i<=n;i++){
22                 int px=p[i].x,py=p[i].y;
23                 for(int x=px+1;x<W &&a[x][py];x++)hash[c][i]++;
24                 for(int x=px-1;x>=0&&a[x][py];x--)hash[c][i]++;
25                 for(int y=py+1;y<H &&a[px][y];y++)hash[c][i]++;
26                 for(int y=py-1;y>=0&&a[px][y];y--)hash[c][i]++;
27             }
28             sort(hash[c]+1,hash[c]+n+1);
29         }
30         flag=true;for(int i=1;i<=n;i++)if(hash[0][i]!=hash[1][i]){flag=false;break;}
31         cout<<(flag?"YES":"NO")<<endl;
32     }
33     return 0;
34 } 
~~Jason_liu O(∩_∩)O
原文地址:https://www.cnblogs.com/JasonCow/p/12294775.html