📜  门| GATE-CS-2017(套装1)|问题 16(1)

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

问题 16
问题描述

给定一个大小为 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