📅  最后修改于: 2023-12-03 15:28:45.595000             🧑  作者: Mango
给定一个大小为 n 的迷宫。迷宫包含若干个正方形单元格,在某些单元格中有墙壁。每个单元格要么是空闲,要么是墙壁。你的目标是找到从迷宫的左上角到右下角的最短路径。
你只能向上、向下、向左或向右移动。你不能移动到任何墙壁上。
输入格式: 矩阵,[[0, 1, 1], [0, 0, 1], [1, 0, 0]] 代表:
0 0 1 0 1 0 1 1 0
输出格式: 返回最短的路线长度,如果没有路线,返回-1。
题目可以看成是一张图,想到使用 BFS 进行求解。可以用辅助矩阵 distance 记录源点到该点的距离,可以用辅助矩阵 visited 记录该点是否已经被访问过。
在使用 BFS 过程中,一旦遇到目标点就可以直接返回到该点的距离值即可。
def solution(maze):
if not maze:
return -1
rows, cols = len(maze), len(maze[0])
visited = [[False] * cols for _ in range(rows)]
distance = [[0] * cols for _ in range(rows)]
queue = [(0, 0)]
directions = [(0, 1), (0, -1), (1, 0), (-1, 0)]
while queue:
row, col = queue.pop(0)
if row == rows - 1 and col == cols - 1:
return distance[row][col]
for dr, dc in directions:
r, c = row + dr, col + dc
if r < 0 or c < 0 or r >= rows or c >= cols or visited[r][c] or maze[r][c] == 1:
continue
distance[r][c] = distance[row][col] + 1
visited[r][c] = True
queue.append((r, c))
return -1