📌  相关文章
📜  门| Sudo GATE 2020 Mock III(2019 年 1 月 24 日)|第 62 题(1)

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

题目描述

给定一个$N \times M$的矩阵,每个元素表示该位置上是否有门(1表示有门,0表示无门)。你从左上角出发,要到达右下角,只能向上下左右四个方向移动,不能走到没有门的位置上。请计算从左上角到右下角的最短距离。

解题思路

本题其实就是求从一个起点到一个终点的最短路径,所以我们可以想到使用广度优先搜索算法(BFS)来解决本题。

具体的实现思路如下:

  1. 创建一个队列,将起点加入队列中,并将起点的距离设为0。
  2. 从队列中取出队首元素,遍历该位置上下左右四个方向的元素。
  3. 对于任意一个可达的元素,计算它与起点的距离(即父节点的距离加一),将该元素标记为已访问,加入队列中。
  4. 继续从队列中取出队首元素,重复2、3步骤。直到找到终点,或队列为空为止。

最后,返回起点到终点的距离即可。

代码实现

以下是本题的AC代码片段:

def bfs(matrix, start, end):
    queue = [(start, 0)]
    visited = set()
    visited.add(start)
    while queue:
        curr, dist = queue.pop(0)
        if curr == end:
            return dist
        i, j = curr[0], curr[1]
        for ii, jj in [(i-1, j), (i+1, j), (i, j-1), (i, j+1)]:
            if 0 <= ii < len(matrix) and 0 <= jj < len(matrix[0]) and matrix[ii][jj] == 1 and (ii, jj) not in visited:
                visited.add((ii, jj))
                queue.append(((ii, jj), dist+1))
    return -1

其中,参数matrix为给定的矩阵,参数start为起点位置,参数end为终点位置。函数最后返回两点间的最短距离,如果两点不连通,则返回-1。

本题中使用的是BFS算法,时间复杂度为$O(NM)$,空间复杂度可达到$O(NM)$。