题目描述
有一个推箱子的游戏, 一开始的情况如下图:
上图中, '.' 表示可到达的位置, '#' 表示不可到达的位置,其中 S 表示你起始的位置, 0表示初始箱子的位置, E表示预期箱子的位置,你可以走到箱子的上下左右任意一侧, 将箱子向另一侧推动。如下图将箱子向右推动一格;
..S0.. -> ...S0.
注意不能将箱子推动到'#'上, 也不能将箱子推出边界;
现在, 给你游戏的初始样子, 你需要输出最少几步能够完成游戏, 如果不能完成, 则输出-1
输入描述
第一行为2个数字,n, m, 表示游戏盘面大小有n 行m 列(5< n, m < 50);
后面为n行字符串,每行字符串有m字符, 表示游戏盘面;
输出描述
一个数字,表示最少几步能完成游戏,如果不能,输出-1;
示例1
输入:
3 6
.S#..E
.#.0..
......
输出: 11
算法分析
典型的迷宫搜索问题,求最短时间,我们首先想到BFS。
和典型的迷宫搜索问题不同的是,本题中的搜索可以分为两个阶段。
第一阶段:游戏玩家从起始位置“S”走到箱子的位置(箱子的上、下、左、右)。
第二阶段:游戏玩家把箱子从“0”位置推到“E”位置。
在第一阶段中,和普通的BFS一样。在第二阶段中,玩家要和箱子一起移动。
提交代码:
#include
#include
#include
#include
#include