目录

1091:二进制矩阵中的最短路径(1658 分)

力扣第 141 场周赛第 3 题

题目

给你一个 n x n 的二进制矩阵 grid 中,返回矩阵中最短 畅通路径 的长度。如果不存在这样的路径,返回 -1

二进制矩阵中的 畅通路径 是一条从 左上角 单元格(即,(0, 0))到 右下角 单元格(即,(n - 1, n - 1))的路径,该路径同时满足下述要求:

  • 路径途经的所有单元格的值都是 0
  • 路径中所有相邻的单元格应当在 8 个方向之一 上连通(即,相邻两单元之间彼此不同且共享一条边或者一个角)。

畅通路径的长度 是该路径途经的单元格总数。

示例 1:

输入:grid = [[0,1],[1,0]]
输出:2

示例 2:

输入:grid = [[0,0,0],[1,1,0],[1,1,0]]
输出:4

示例 3:

输入:grid = [[1,0,0],[1,1,0],[1,1,0]]
输出:-1

提示:

  • n == grid.length
  • n == grid[i].length
  • 1 <= n <= 100
  • grid[i][j]01

分析

典型的 bfs。

解答

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
def shortestPathBinaryMatrix(self, grid: List[List[int]]) -> int:
	if grid[0][0]:
		return -1
	n = len(grid)
	Q, vis = deque([(0, 0, 1)]), {(0, 0)}
	while Q:
		r,c,k = Q.popleft()
		if r==c==n-1:
			return k
		for x,y in product(range(r-1, r+2), range(c-1, c+2)):
			if 0<=x<n and 0<=y<n and grid[x][y]==0 and (x,y) not in vis:
				Q.append((x, y, k+1))
				vis.add((x, y))
	return -1

368 ms