返回
剑指 Offer 1091. 二进制矩阵中的最短路径(Python)
后端
2023-12-12 08:01:10
破解 LeetCode 1091:用 BFS 算法探索二进制矩阵
踏上精彩的旅程,我们将携手征服 LeetCode 1091 难题。在这个谜团中,你将踏入一个二进制矩阵,寻求从起点到终点的最短路径。是的,你猜对了,BFS(广度优先搜索)算法将成为我们破解难题的秘密武器。准备好了吗?让我们开始这场激动人心的冒险!
BFS:通往胜利的秘密武器
广度优先搜索(BFS)算法就像一位谨慎的探险家,它一层一层地深入矩阵,探索可行的路径,直到找到通往终点的捷径。想象一下,你手持一盏明亮的灯笼,照亮你探索的每一步,而 BFS 算法就是这盏灯笼,指引着你走向胜利。
BFS 套路:破解迷宫的钥匙
掌握 BFS 算法的套路,是解开难题的关键:
- 队列: 存放当前待探索的节点,就像探险家队伍中等待探索的队员。
- 标记数组: 记录已访问的节点,防止我们陷入探索死胡同。
- 循环: 逐层探索矩阵,就像探险家一步步深入迷宫。
- 终点检查: 不断检查队列中的节点是否到达终点,如果找到,那就恭喜你,胜利就在眼前!
- 路径长度: 每层探索一次,路径长度就会增加一步,就像探险家每前进一步,距离终点就更近一步。
Python 实现:踏上代码之旅
import collections
class Solution:
def shortestPathBinaryMatrix(self, grid: List[List[int]]) -> int:
if not grid or grid[0][0] or grid[-1][-1]:
return -1
m, n = len(grid), len(grid[0])
queue = collections.deque([(0, 0)])
visited = set()
visited.add((0, 0))
step = 1
while queue:
size = len(queue)
for _ in range(size):
x, y = queue.popleft()
if x == m - 1 and y == n - 1:
return step
for dx, dy in [(1, 0), (0, 1), (-1, 0), (0, -1), (1, 1), (1, -1), (-1, 1), (-1, -1)]:
nx, ny = x + dx, y + dy
if 0 <= nx < m and 0 <= ny < n and (nx, ny) not in visited and not grid[nx][ny]:
queue.append((nx, ny))
visited.add((nx, ny))
step += 1
return -1
结语:通往成功的捷径
BFS 算法就像一盏明灯,照亮了我们破解 LeetCode 1091 难题的道路。通过层层深入二进制矩阵,我们最终找到了通往终点的最短路径,也证明了算法在解决复杂问题中的强大力量。
常见问题解答
-
什么是 BFS 算法?
BFS 是一种广度优先搜索算法,它逐层探索节点,直到找到目标。 -
BFS 算法在 LeetCode 1091 中如何工作?
BFS 算法从起点出发,一层一层地探索矩阵,寻找通往终点的最短路径。 -
Python 代码中 queue 和 visited 的作用是什么?
queue 存储待探索的节点,visited 记录已访问的节点,防止重复探索。 -
为什么需要检查终点?
终点检查是为了判断当前探索的节点是否到达终点,如果到达,则算法终止并返回路径长度。 -
BFS 算法的优势是什么?
BFS 算法能够快速找到最短路径,而且易于理解和实现。