推箱子
难度:
标签:
题目描述
「推箱子」是一款风靡全球的益智小游戏,玩家需要将箱子推到仓库中的目标位置。
游戏地图用大小为 m x n
的网格 grid
表示,其中每个元素可以是墙、地板或者是箱子。
现在你将作为玩家参与游戏,按规则将箱子 'B'
移动到目标位置 'T'
:
- 玩家用字符
'S'
表示,只要他在地板上,就可以在网格中向上、下、左、右四个方向移动。 - 地板用字符
'.'
表示,意味着可以自由行走。 - 墙用字符
'#'
表示,意味着障碍物,不能通行。 - 箱子仅有一个,用字符
'B'
表示。相应地,网格上有一个目标位置'T'
。 - 玩家需要站在箱子旁边,然后沿着箱子的方向进行移动,此时箱子会被移动到相邻的地板单元格。记作一次「推动」。
- 玩家无法越过箱子。
返回将箱子推到目标位置的最小 推动 次数,如果无法做到,请返回 -1
。
示例 1:
输入:grid = [["#","#","#","#","#","#"], ["#","T","#","#","#","#"], ["#",".",".","B",".","#"], ["#",".","#","#",".","#"], ["#",".",".",".","S","#"], ["#","#","#","#","#","#"]] 输出:3 解释:我们只需要返回推箱子的次数。
示例 2:
输入:grid = [["#","#","#","#","#","#"], ["#","T","#","#","#","#"], ["#",".",".","B",".","#"], ["#","#","#","#",".","#"], ["#",".",".",".","S","#"], ["#","#","#","#","#","#"]] 输出:-1
示例 3:
输入:grid = [["#","#","#","#","#","#"], ["#","T",".",".","#","#"], ["#",".","#","B",".","#"], ["#",".",".",".",".","#"], ["#",".",".",".","S","#"], ["#","#","#","#","#","#"]] 输出:5 解释:向下、向左、向左、向上再向上。
提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 20
grid
仅包含字符'.'
,'#'
,'S'
,'T'
, 以及'B'
。grid
中'S'
,'B'
和'T'
各只能出现一个。
代码结果
运行时间: 50 ms, 内存: 16.4 MB
解释
方法:
This solution uses a Breadth-First Search (BFS) approach to simulate the movement of both the player and the box in a grid-based puzzle game. The algorithm involves checking every possible movement of the box and corresponding positioning of the player necessary to push the box. For every box move, the player's ability to reach the position needed to make that push is verified through another BFS that takes into account the current box's position as an obstacle.
时间复杂度:
O((m*n)^3)
空间复杂度:
O((m*n)^2)
代码细节讲解
🦆
给定你的 BFS 方法中使用了多个队列和访问集合,你是如何决定使用这些数据结构来跟踪游戏状态的?
▷🦆
在确认玩家是否可以到达推动箱子的位置时,你的算法中有一个 `check` 函数。此函数在什么情况下返回 `False`?
▷🦆
在主循环内,你的算法尝试移动箱子并更新玩家位置。请问如果玩家和箱子的初始位置导致无法开始移动,你的算法如何处理这种情况?
▷🦆
你的 `check` 函数在确定玩家是否可以到达下一个位置时使用了 BFS。为什么选择 BFS 而不是 DFS 或其他搜索算法?
▷