题目
给出起点,给出箱子的位置,给出目的地,求最少需要多少步能够将箱子推到目的地;如果不存在,返回-1,如下图所示:
转化为字符如下:
分析
今日头条校招笔试中的一道题,比实习笔试复杂太多,花了我一下午的时间(3个多小时)才写出来,使用BFS+BFS,代码比较复杂,没有简化;本意是熟悉BFS,关于BFS的输出问题,后期会补上
这道题和我之前见到的自走迷宫有点像,自走迷宫是纯粹的BFS,这道题还需要转化一下;
当然和DFS一样肯定会重复,而用DP解决,这里先不谈这个;
以箱子为分析的重点,每次箱子可以向上右下左这四个方向移动,假设此时箱子需要向上移动,那么人先需要从前一个位置移动箱子下面的位置,才能把箱子向上推动
这里出现了一个子问题:从前一个位置移动到箱子下面的位置的最短路径,这是子BFS
主BFS如下:
每次判断箱子是否可以向指定方向移动,如果可以,则用队列将箱子移动后的点存储下来,把此时人得位置存储下来,把此时总共走得步数存储下来;
如果队列不为空,找到队列左边的点的步数小于min值的点来继续分析,如果该点等于目的点,将该点得步数替换min,继续找步数小于min的点分析,知道队列为空,返回-1或min;
代码
|
|