哈希,对于每个点哈希一次
哈希的方式:该点到联通分量边界(上下左右)的距离和
然后分别对两个图的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 }
来源:https://www.cnblogs.com/JasonCow/p/12294775.html