📜  门| GATE-CS-2002 |第 46 题(1)

📅  最后修改于: 2023-12-03 15:12:39.846000             🧑  作者: Mango

题目描述

给定一个迷宫,它由字符矩阵表示。当你从矩阵的位置 (x, y) 出发,你可以向上、下、左、右四个方向移动。若你到达位置 (p, q),并且 matrix[p][q] 等于 1,则认为你已经到达迷宫的一个门,需要输出从起点 (x, y)到门 (p, q) 的最短距离。

如果无法到达门,则输出 -1

函数签名
def min_steps_to_reach_gate(matrix: List[List[int]], x: int, y: int, p: int, q: int) -> int:
    pass
输入参数
  • matrix:表示迷宫的字符矩阵,大小为 $m\times n$。其中, matrix[i][j] 的取值范围为 $0$ 或 $1$,表示 第 $i$ 行第 $j$ 列的位置是否可通行。$0$ 表示可通行,$1$ 表示不可通行。

  • (x, y):起点的坐标。

  • (p, q):门的坐标。

输出参数
  • 返回从起点 (x, y)到门 (p, q) 的最短距离。
示例
matrix = [
    [0, 1, 0, 0],
    [0, 0, 0, 1],
    [1, 1, 0, 0],
    [1, 1, 1, 0]
]

assert min_steps_to_reach_gate(matrix, 0, 0, 3, 3) == 6
assert min_steps_to_reach_gate(matrix, 0, 0, 0, 1) == 1
assert min_steps_to_reach_gate(matrix, 0, 0, 2, 2) == -1
解题思路

本题要求求出从起点到门的最短距离,因此最直观的想法是使用带权图上的最短路径算法。因此,可以采用 BFS(广度优先搜索)求解。

具体来说,我们从起点 (x, y) 出发,遍历所有可通行的位置,并把它们的距离设为 $1$。然后,从这些位置开始向外扩展,将其周围可通行的未访问位置设为当前位置的距离 $+1$,直到到达目标位置 (p, q),或是已经遍历完所有距离小于等于目标位置的位置。

由于 BFS 保证了所有可能的节点都被访问且仅被访问一次,因此最后到达目标位置时,路径长度一定最小。

时间复杂度分析

本题使用 BFS 来求解,时间复杂度为 $O(mn)$,其中 $m$ 和 $n$ 分别为迷宫的行数和列数。

算法实现

下面是 Python 代码: