2020-5 leetcode 1263. 推箱子

1.用BFS遍历来得到答案。
难点:1.怎么把人和箱子的状态连接起来(这里用四维数组dist 连接,并且作为标记数组)
2.分析人的下一步对箱子的影响:1.当人的下一步是箱子所处位置时,要明白:箱子所走的方向和人走的方向是一致的。
2.当不是箱子所处位置时,对箱子无影响。
因为是BFS 所以第一次碰到终点时,便是答案

 struct Dwell{
     
        int box_x,box_y;
        int man_x,man_y;
        Dwell(int _bx,int _by,int _mx,int _my):box_x(_bx),box_y(_by),man_x(_mx),man_y(_my){
     }
    };

class Solution {
     
public:
    int dir[4][2]={
     {
     -1,0},{
     1,0},{
     0,-1},{
     0,1}};
    int minPushBox(vector<vector<char>>& grid) {
     
        int m=grid.size();
        int n=grid[0].size();
        int dist[m][n][m][n];
        memset(dist,-1,sizeof(dist));

        int box_x,box_y;
        int start_x,start_y;
        int end_x,end_y;

        for(int i=0;i<m;i++){
     
            for(int j=0;j<n;j++){
     
                if(grid[i][j]=='B'){
     
                    box_x=i;
                    box_y=j;
                    grid[i][j]='.';
                }
                else if(grid[i][j]=='S'){
     
                    start_x=i;
                    start_y=j;
                    grid[i][j]='.';
                }
                else if(grid[i][j]=='T'){
     
                    end_x=i;
                    end_y=j;
                    grid[i][j]='.';
                }
            }
        }

        queue<Dwell> q;
        q.push({
     box_x,box_y,start_x,start_y});
        dist[box_x][box_y][start_x][start_y]=0;

        while(!q.empty()){
     
            queue<Dwell> nq;
            
            while(!q.empty()){
     
                auto cur=q.front();
                q.pop();
            
            for(int i=0;i<4;i++){
     
                int nxt_x=cur.man_x+dir[i][0];
                int nxt_y=cur.man_y+dir[i][1];

                if(nxt_x>=0&&nxt_x<m&&nxt_y>=0&&nxt_y<n){
     
                    if(cur.box_x==nxt_x&&cur.box_y==nxt_y){
     
                        int nxt_box_x=cur.box_x+dir[i][0];
                        int nxt_box_y=cur.box_y+dir[i][1];
                        if(nxt_box_x>=0&&nxt_box_x<m&&nxt_box_y>=0&&nxt_box_y<n){
     
                            if(grid[nxt_box_x][nxt_box_y]=='.'&&dist[nxt_box_x][nxt_box_y][nxt_x][nxt_y]==-1){
     
                        nq.emplace(nxt_box_x,nxt_box_y,nxt_x,nxt_y);
                        dist[nxt_box_x][nxt_box_y][nxt_x][nxt_y]=dist[cur.box_x][cur.box_y][cur.man_x][cur.man_y]+1;
                            }
                            if(nxt_box_x==end_x&&nxt_box_y==end_y){
     
                                return dist[nxt_box_x][nxt_box_y][nxt_x][nxt_y];
                            }

                        }
                    }

                    else{
     
                        if(grid[nxt_x][nxt_y]=='.'&&dist[cur.box_x][cur.box_y][nxt_x][nxt_y]==-1){
     
                                q.emplace(cur.box_x,cur.box_y,nxt_x,nxt_y);
                                dist[cur.box_x][cur.box_y][nxt_x][nxt_y]=dist[cur.box_x][cur.box_y][cur.man_x][cur.man_y];
                        }
                    }

                }
      
            }
            }
            q=nq;
        }
        return -1;
    }
};

你可能感兴趣的:(leetcode)