报告见代码。。
1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4 #include <algorithm>
5 using namespace std;
6
7 const int MAX=105;
8 int dir[4][2]={1,0,-1,0,0,1,0,-1};
9 int h,w,n;
10 int maze[MAX][MAX];
11 int maze2[MAX][MAX];
12 struct{
13 int x,y;
14 }save[1000];
15 int sa;
16 int h1[1000];
17 int h2[1000];
18
19 void dfs(int i,int j,int (*p)[MAX]){
20 p[i][j]=0;
21 save[++sa].x=i;save[sa].y=j;
22 for(int k=0;k<4;k++){
23 int tx,ty;
24 tx=i+dir[k][0];
25 ty=j+dir[k][1];
26 if(p[tx][ty]==1&&tx<h&&tx>=0&&ty<w&&ty>=0)
27 dfs(tx,ty,p);
28 }
29 }
30
31 void calculate(int *ha,int &top){ //HASH函数是各点对的距离的平方。。。也过。
32 int i,j,x=0,y=0; top++;
33 for(i=1;i<=sa;i++){
34 x=save[i].x;
35 y=save[i].y;
36 for(j=i+1;j<=sa;j++){
37 int dx=abs(x-save[j].x);
38 int dy=abs(y-save[j].y);
39 int dis=dx*dx+dy*dy;
40 ha[top]+=dis;
41 }
42 }
43 }
44
45 void slove(int (*p)[MAX],int *ha,int &top){
46 int i,j;
47 for(i=0;i<h;i++){
48 for(j=0;j<w;j++){
49 sa=0;
50 if(p[i][j]==1){
51 dfs(i,j,p);
52 calculate(ha,top);
53 }
54 }
55 }
56 }
57
58 int main(){
59 int x,y,cas;
60 scanf("%d",&cas);
61 while(cas--){
62 scanf("%d%d%d",&w,&h,&n);
63 memset(maze,0,sizeof(maze));
64 memset(maze2,0,sizeof(maze2));
65 memset(h1,0,sizeof(h1));
66 memset(h2,0,sizeof(h2));
67 int top1=-1,top2=-1;
68 for(int i=1;i<=n;i++){
69 scanf("%d%d",&x,&y);
70 maze[y][x]=1;
71 }
72 /* for(int i=0;i<h;i++){
73 for(int j=0;j<w;j++)
74 printf("%d ",maze[i][j]);
75 printf("\n");
76 }*/
77 for(int i=1;i<=n;i++){
78 scanf("%d%d",&x,&y);
79 maze2[y][x]=1;
80 }
81 /* for(int i=0;i<h;i++){
82 for(int j=0;j<w;j++)
83 printf("%d ",maze2[i][j]);
84 printf("\n");
85 }*/
86 slove(maze,h1,top1);
87 slove(maze2,h2,top2);
88 if(top1!=top2){
89 printf("NO\n");
90 continue;
91 }
92 bool flag=true;
93 sort(h1,h1+top1+1);
94 sort(h2,h2+top2+1);
95 for(int i=0;i<=top1;i++){
96 // printf("%d %d \n",h1[i],h2[i]);
97 if(h1[i]!=h2[i]){
98 flag=false;
99 break;
100 }
101 }
102 if(!flag)
103 printf("NO\n");
104 else
105 printf("YES\n");
106 }
107 return 0;
108 }
时间: 2024-10-10 08:50:41