字节跳动2018校招后端方向(第三批)编程题1

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

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

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

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

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

 

输入描述:

第一行为2个数字,n, m, 表示游戏盘面大小有n 行m 列(5< n, m < 50);
后面为n行字符串,每行字符串有m字符, 表示游戏盘面;

 

输出描述:

一个数字,表示最少几步能完成游戏,如果不能,输出-1;

 

输入例子1:

3 6
.S#..E
.#.0..
......

 

输出例子1:

11

 

题意:推箱子游戏

思路:求最少步数,所以第一反应是bfs,第一次写的时候只记录了人走过的vis[x][y]=1,但是这样是有问题的,因为这样就会在推箱子的过程中无法走到某些点,因此是需要一个四维的vis来记录人和箱子的坐标状态,要把人和箱子的位置,作为一个不允许重复的状态。

#include
#include
#include
#include
#include
#include
using namespace std;
 
int n,m;
char mp[55][55];
int dir[4][2]={0,1,0,-1,1,0,-1,0};
int sx,sy,bx,by,ex,ey;
int vis[55][55][55][55];
 
struct node{
    int x,y;
    int boxx,boxy;
    int step;
};
bool check(int i,int j){
    if(i<0||j<0||i>=n||j>=m||mp[i][j]=='#')return 1;
    return 0;
}
 
int bfs(){
    queueQ;
    node now,next;
    now.x=sx;now.y=sy;now.boxx=bx;now.boxy=by;
    now.step=0;
    vis[now.x][now.y][now.boxx][now.boxy]=1;
    Q.push(now);
     
    while(!Q.empty()){
        now=Q.front();
        Q.pop();
        for(int i=0;i<4;i++){
            next=now;
            next.x+=dir[i][0];next.y+=dir[i][1];
            next.step++;
            if(check(next.x,next.y))continue;
             
            if(next.x==next.boxx&&next.y==next.boxy){
            //cout<>n>>m;
    for(int i=0;i>mp[i];
    }
    memset(vis,0,sizeof(vis));
    for(int i=0;i

 

你可能感兴趣的:(bfs)