POJ 1021 人品题
报告见代码。。
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 }