hdu 1245(推箱子) BFS

纠结了一个上午,原来是运算符重载弄错了!我去。

该题用一个四维数组标记人和箱子的当前状态。在判断是否满足队列条件时,用continue巧妙的处理了,如果搬运工遇到箱子的问题。

  1 #include<iostream>
  2 #include<cstring>
  3 #include<cstdio>
  4 #include<queue>
  5 using namespace std;
  6 struct node
  7 {
  8     int x,y;
  9     int bx,by;
 10     int step;
 11     bool friend operator<(node a,node b)
 12     {
 13        return a.step>b.step;//这里开始定义的小于  交了n次都不对
 14     };
 15 };
 16 #define N 10
 17 int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
 18 int map[N][N];
 19 int mark[N][N][N][N];
 20 int sx,sy,bx,by,ex,ey;
 21 int n,m;
 22 void BFS()
 23 {
 24     memset(mark,0,sizeof(mark));
 25     node cur,next;
 26     priority_queue<node>q;
 27     int x,y,xx,yy,i;
 28     cur.x=sx;cur.y=sy;cur.bx=bx;cur.by=by;cur.step=0;
 29     q.push(cur);
 30     mark[sx][sy][bx][by]=1;
 31     while(!q.empty())
 32     {
 33         cur=q.top();
 34         q.pop();
 35         if(cur.bx==ex&&cur.by==ey)
 36         {
 37             printf("%d\n",cur.step);
 38             return ;
 39         }
 40         for(i=0;i<4;i++)
 41         {
 42             next.x=x=cur.x+dir[i][0];
 43             next.y=y=cur.y+dir[i][1];
 44             next.bx=xx=cur.bx;
 45             next.by=yy=cur.by;
 46             next.step=cur.step;
 47             if(x<0||x>=n||y<0||y>=m)//第一次用for循环写判断符合条件的WA了,改用continue可以很好的处理如果搬运工前面是箱子的问题
 48                 continue;
 49             if(map[x][y]==1||mark[x][y][xx][yy]==1)
 50                 continue;
 51             if(x==xx&&y==yy)
 52             {
 53                 next.bx=xx=xx+dir[i][0];
 54                 next.by=yy=yy+dir[i][1];
 55                 next.step++;
 56                 if(xx<0||xx>=n||yy<0||yy>=m)
 57                 continue;
 58                 if(map[xx][yy]==1||mark[x][y][xx][yy]==1)
 59                     continue;
 60 
 61             }
 62             q.push(next);
 63             mark[x][y][xx][yy]=1;
 64 
 65         }
 66     }
 67     printf("-1\n");
 68     return ;
 69 }
 70 int main()
 71 {
 72    //freopen("input.txt","r",stdin);
 73   //  freopen("output.txt","w",stdout);
 74    int  t;
 75    scanf("%d",&t);
 76    while(t--)
 77    {
 78        memset(map,0,sizeof(map));
 79        scanf("%d%d",&n,&m);
 80        int i,j;
 81        for(i=0;i<n;i++)
 82        {
 83 
 84            for(j=0;j<m;j++)
 85            {
 86                scanf("%d",&map[i][j]);
 87            }
 88        }
 89        for(i=0;i<n;i++)
 90        {
 91            for(j=0;j<m;j++)
 92            {
 93                if(map[i][j]==4)
 94                {
 95                   sx=i,sy=j;
 96                   
 97                }
 98                else if(map[i][j]==2)
 99                {
100                    bx=i,by=j;
101 
102                }
103                else if(map[i][j]==3)
104                {
105                    ex=i,ey=j;
106                    
107                }
108            }
109        }
110        BFS();
111    }
112 
113     return 0;
114 }

 

 

 

你可能感兴趣的:(HDU)