穿过迷宫的最少移动次数
难度:
标签:
题目描述
你还记得那条风靡全球的贪吃蛇吗?
我们在一个 n*n
的网格上构建了新的迷宫地图,蛇的长度为 2,也就是说它会占去两个单元格。蛇会从左上角((0, 0)
和 (0, 1)
)开始移动。我们用 0
表示空单元格,用 1 表示障碍物。蛇需要移动到迷宫的右下角((n-1, n-2)
和 (n-1, n-1)
)。
每次移动,蛇可以这样走:
- 如果没有障碍,则向右移动一个单元格。并仍然保持身体的水平/竖直状态。
- 如果没有障碍,则向下移动一个单元格。并仍然保持身体的水平/竖直状态。
- 如果它处于水平状态并且其下面的两个单元都是空的,就顺时针旋转 90 度。蛇从(
(r, c)
、(r, c+1)
)移动到 ((r, c)
、(r+1, c)
)。
- 如果它处于竖直状态并且其右面的两个单元都是空的,就逆时针旋转 90 度。蛇从(
(r, c)
、(r+1, c)
)移动到((r, c)
、(r, c+1)
)。
返回蛇抵达目的地所需的最少移动次数。
如果无法到达目的地,请返回 -1
。
示例 1:
输入:grid = [[0,0,0,0,0,1], [1,1,0,0,1,0], [0,0,0,0,1,1], [0,0,1,0,1,0], [0,1,1,0,0,0], [0,1,1,0,0,0]] 输出:11 解释: 一种可能的解决方案是 [右, 右, 顺时针旋转, 右, 下, 下, 下, 下, 逆时针旋转, 右, 下]。
示例 2:
输入:grid = [[0,0,1,1,1,1], [0,0,0,0,1,1], [1,1,0,0,0,1], [1,1,1,0,0,1], [1,1,1,0,0,1], [1,1,1,0,0,0]] 输出:9
提示:
2 <= n <= 100
0 <= grid[i][j] <= 1
- 蛇保证从空单元格开始出发。
代码结果
运行时间: 75 ms, 内存: 18.4 MB
解释
方法:
该题解使用广度优先搜索(BFS)来寻找蛇从起点到终点的最短路径。每次搜索时,根据蛇的当前状态(水平或竖直)以及周围的障碍物情况,将下一步可能的移动状态加入队列中。同时使用一个集合 visted 来记录已访问过的状态,避免重复搜索。当搜索到达目标位置时,返回移动的次数 count。如果无法到达目标位置,则返回 -1。
时间复杂度:
O(n^2)
空间复杂度:
O(n^2)
代码细节讲解
🦆
为什么在算法中使用广度优先搜索(BFS)而不是深度优先搜索(DFS)或其他搜索算法?
▷🦆
在记录已访问状态时,你是如何确定包括方向在内的五元组(i, j, x, y, z)足以唯一标识蛇的状态的?
▷🦆
算法中对于蛇的旋转操作是否有特定的条件限制,例如,为什么旋转前需要检查下方或右方两个单元是否为空?
▷🦆
如果蛇的起始位置或目标位置初始就被障碍物阻碍,这种情况下算法是否能正确返回-1表示无法到达?
▷