BFS(迷宫)--推箱子

有一个推箱子的游戏, 一开始的情况如下图:

BFS(迷宫)--推箱子_第1张图片

上图中, '.' 表示可到达的位置, '#' 表示不可到达的位置,其中 S 表示你起始的位置, 0表示初始箱子的位置, E表示预期箱子的位置,你可以走到箱子的上下左右任意一侧, 将箱子向另一侧推动。如下图将箱子向右推动一格;

..S0.. -> ...S0.

注意不能将箱子推动到'#'上, 也不能将箱子推出边界;

现在, 给你游戏的初始样子, 你需要输出最少几步能够完成游戏, 如果不能完成, 则输出-1。

链接:https://www.nowcoder.com/questionTerminal/b976b7b95fae41b5855529181fd3605f?orderByHotValue=1&page=1&onlyReference=false
来源:牛客网

#include 
using namespace std;
int n,m;
int dir[4][2]={1,0,0,1,-1,0,0,-1};
int vis[50][50][50][50];
vector view;
struct node{
        int a_x,a_y,b_x,b_y,step;
        node(int a_x,int a_y,int b_x,int b_y,int step):
                a_x(a_x),a_y(a_y),b_x(b_x),b_y(b_y),step(step){};
 
};
bool isTrue(int x,int y)
{
        if(x<0||y<0||x>=n||y>=m||view[x][y]=='#')
                return false;
        return true;
}
int bfs(int start_x,int start_y,int box_x,int box_y)
{
        queue ans;
        ans.push(node(start_x,start_y,box_x,box_y,0));
        vis[start_x][start_y][box_x][box_y]=1;
        while(!ans.empty())
        {
                node p=ans.front();
                ans.pop();
                int ax=p.a_x;
                int ay=p.a_y;
                int bx=p.b_x;
                int by=p.b_y;
                int step=p.step;
                for(int i=0;i<4;i++)
                {
                        int new_ax=ax+dir[i][0];
                        int new_ay=ay+dir[i][1];
                        int new_bx=bx+dir[i][0];
                        int new_by=by+dir[i][1];
                        if(!isTrue(new_ax,new_ay))
                                continue;
                        //移动到箱子前
                        if((new_ax!=bx||new_ay!=by)&&vis[new_ax][new_ay][bx][by]==0)
                        {
                                vis[new_ax][new_ay][bx][by]=1;
                                ans.push(node(new_ax,new_ay,bx,by,step+1));
                        }
                        //人和箱子一起移动
                        else if(new_ax==bx&&new_ay==by&&isTrue(new_bx,new_by)&&vis[new_ax][new_ay][new_bx][new_by]==0)
                        {
                                vis[new_ax][new_ay][new_bx][new_by]==1;
                                if(view[new_bx][new_by]=='E')
                                        return step+1;
                                ans.push(node(new_ax,new_ay,new_bx,new_by,step+1));
                        }
 
                }
        }
        return -1;
 
}
int main() {
        memset(vis,-0,sizeof(vis));
        cin>>n>>m;
        view=vector (n,string(""));
        for(int i=0;i>view[i];
        int start_x,start_y,box_x,box_y;
        for(int i=0;i

 

你可能感兴趣的:(BFS(迷宫)--推箱子)