📅  最后修改于: 2023-12-03 15:22:00.933000             🧑  作者: Mango
给定一个二进制矩阵,其中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),因为我们需要一个数组来记录每个单元格是否访问过。