BFS(迷宫)--推箱子

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

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

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

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

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

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

#include <bits/stdc++.h>
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<string> 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<node> 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<string> (n,string(""));
        for(int i=0;i<n;i++)
                cin>>view[i];
        int start_x,start_y,box_x,box_y;
        for(int i=0;i<n;i++)
                for(int j=0;j<m;j++)
                {
                        if(view[i][j]=='S')
                                start_x=i,start_y=j;
                        else if(view[i][j]=='0')
                                box_x=i,box_y=j;
                }
        cout<<bfs(start_x,start_y,box_x,box_y)<<endl;
    return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值