leetcode
leetcode 3001 ~ 3050
传送卷轴

传送卷轴

难度:

标签:

题目描述

English description is not available for the problem. Please switch to Chinese.

代码结果

运行时间: 701 ms, 内存: 17.1 MB


解释

方法:

该题解采用了两步广度优先搜索(BFS)和优先队列(最小堆)的混合策略。首先,从魔法水晶位置(终点T)开始第一次BFS,遍历迷宫以计算每个空地到魔法水晶的最短步数。这些步数储存在二维数组arr中,其中墙壁的位置被标记为-2。接下来,从小扣的起始位置(起点S)开始,使用优先队列进行另一次搜索,以考虑魔法卷轴的使用。搜索时,每次移动到一个新位置时,都会计算如果在此使用魔法卷轴的话,被传送到镜像位置后到达终点T的最短步数,并更新到达终点T的最短距离。

时间复杂度:

O((m*n) * log(m*n))

空间复杂度:

O(m*n)

代码细节讲解

🦆
在进行第一次BFS时,对于墙壁位置使用了-2进行标记,那么在数组中初始化为-1是出于什么考虑?
在第一次BFS中,数组初始化为-1主要用于区分哪些位置尚未被访问过。由于BFS是用来计算从终点T到迷宫中每个可达点的最短路径,初始化为-1可以方便地检查某个位置是否已被计算过步数。一旦某个位置的步数被计算(即从-1变为具体步数),就表明该位置已经被访问过。而对于墙壁位置使用-2进行标记,则是为了在后续处理中能够快速识别出哪些位置是墙壁,即不可通过的区域。
🦆
第二次搜索时,优先队列考虑了魔法卷轴的使用,但具体是如何计算镜像位置的,以及如何保证这一步的镜像位置不会落在墙壁上?
在第二次使用优先队列的搜索中,代码利用了魔法卷轴的能力来计算镜像位置。具体的镜像位置计算方法是:对于当前位置 (x, y),其在水平方向的镜像位置是 (m-1-x, y) ,而在垂直方向的镜像位置是 (x, n-1-y),其中m和n分别是迷宫的行数和列数。为了确保镜像位置不落在墙壁上,代码在将新位置添加到优先队列之前,会检查该位置在arr数组中的值是否为-2。如果是-2,则表示该位置是墙壁,因此不会选择该位置为有效的传送目标。
🦆
代码中提到如果起始位置S无法到达终点T就返回-1,这是如何通过第一次BFS实现的?具体是哪一部分代码实现这一逻辑?
这一逻辑是通过检查第一次BFS完成后,起始位置S在arr数组中的值来实现的。在进行第一次BFS后,如果起始位置S在arr中的值仍然是-1,这表示从终点T到起始位置S没有有效的路径。这种情况下代码直接返回-1,表示无法到达终点。这一逻辑的实现位于代码中这样一行:`if arr[start[0]][start[1]] == -1: return -1`。这行代码检查起始位置S在数组arr中的值,如果为-1,则返回-1表示无法完成任务。

相关问题