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("
");
 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("
");
 85         }*/
 86         slove(maze,h1,top1);
 87         slove(maze2,h2,top2);
 88         if(top1!=top2){
 89             printf("NO
");
 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 
",h1[i],h2[i]);
 97             if(h1[i]!=h2[i]){
 98                 flag=false;
 99                 break;
100             }
101         }
102         if(!flag)
103         printf("NO
");
104         else
105         printf("YES
");
106     }
107     return 0;
108 }
View Code
原文地址:https://www.cnblogs.com/jie-dcai/p/3775026.html