📅  最后修改于: 2023-12-03 15:28:46.672000             🧑  作者: Mango
给定一个$N \times M$的矩阵,每个元素表示该位置上是否有门(1表示有门,0表示无门)。你从左上角出发,要到达右下角,只能向上下左右四个方向移动,不能走到没有门的位置上。请计算从左上角到右下角的最短距离。
本题其实就是求从一个起点到一个终点的最短路径,所以我们可以想到使用广度优先搜索算法(BFS)来解决本题。
具体的实现思路如下:
最后,返回起点到终点的距离即可。
以下是本题的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)$。