返回

剑指 Offer 1091. 二进制矩阵中的最短路径(Python)

后端

破解 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 难题的道路。通过层层深入二进制矩阵,我们最终找到了通往终点的最短路径,也证明了算法在解决复杂问题中的强大力量。

常见问题解答

  1. 什么是 BFS 算法?
    BFS 是一种广度优先搜索算法,它逐层探索节点,直到找到目标。

  2. BFS 算法在 LeetCode 1091 中如何工作?
    BFS 算法从起点出发,一层一层地探索矩阵,寻找通往终点的最短路径。

  3. Python 代码中 queue 和 visited 的作用是什么?
    queue 存储待探索的节点,visited 记录已访问的节点,防止重复探索。

  4. 为什么需要检查终点?
    终点检查是为了判断当前探索的节点是否到达终点,如果到达,则算法终止并返回路径长度。

  5. BFS 算法的优势是什么?
    BFS 算法能够快速找到最短路径,而且易于理解和实现。