📌  相关文章
📜  从源单元格到二进制矩阵的目标单元格通过仅由 1 组成的单元格的最短路径(1)

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

从源单元格到二进制矩阵的目标单元格通过仅由 1 组成的单元格的最短路径

给定一个二进制矩阵,其中0表示障碍物,1表示可以通过的单元格。找到从源单元格到二进制矩阵的目标单元格通过仅由1组成的单元格的最短路径。如果没有这样的路径,返回-1。

算法概述

我们可以使用广度优先搜索算法。首先将源单元格入队,然后依次处理队列中的每个单元格,将相邻的未访问单元格加入队列。重复此过程直到处理到目标单元格。我们还需要使用一个数组记录每个单元格是否已访问。

代码实现
from collections import deque

def shortestPathBinaryMatrix(grid):
    n = len(grid)
    if grid[0][0] == 1 and grid[n-1][n-1] == 1:
        q = deque()
        visited = [[False for i in range(n)] for j in range(n)]
        q.append((0,0,1))
        visited[0][0] = True

        while q:
            i, j, d = q.popleft()
            if i == n-1 and j == n-1:
                return d

            for di, dj in [(1,0), (-1,0), (0,1), (0,-1), (1,1), (-1,-1), (-1,1), (1,-1)]:
                ni = i + di
                nj = j + dj
                if 0 <= ni < n and 0 <= nj < n and grid[ni][nj] == 1 and not visited[ni][nj]:
                    q.append((ni, nj, d+1))
                    visited[ni][nj] = True

        return -1

    return -1
复杂度分析

这个算法的时间复杂度是O(n^2),因为我们最坏情况下需要遍历整个矩阵。空间复杂度是O(n^2),因为我们需要一个数组来记录每个单元格是否访问过。