有一个推箱子的游戏, 一开始的情况如下图:
上图中, '.' 表示可到达的位置, '#' 表示不可到达的位置,其中 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;
}