📌  相关文章
📜  最小化将矩阵中的所有 1 移动到给定索引所需的步骤(1)

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

最小化将矩阵中的所有 1 移动到给定索引所需的步骤

问题描述

给定一个二维的 01 矩阵,其中只有 1 和 0,1 表示障碍物,0 表示通路,给定一个起点和一个终点,求从起点到终点的最小步数,需要满足在走的过程中只能走上下左右四个方向,不能斜着走,并且不能穿过障碍物。

算法思路

我们可以使用广度优先搜索(BFS)算法来解决这个问题,BFS 是解决最短路径问题的经典算法。我们从起点开始,每次向四个方向扩展节点,直到找到终点或者遍历完整个矩阵。

具体实现步骤如下:

  1. 初始化队列,将起点加入队列中。
  2. 进入循环,如果队列不为空,取出队首元素。
  3. 判断队首元素是否为终点,如果是,返回当前步数。
  4. 否则,遍历四个方向,如果该方向可行,则将该节点加入队列尾部,同时标记已访问。
  5. 如果队列中没有元素,说明无法到达终点,返回 -1。
代码实现
from collections import deque


class Solution:

    def shortestPathBinaryMatrix(self, grid: List[List[int]]) -> int:
        rows, cols = len(grid), len(grid[0])
        # 边界判断
        if grid[0][0] == 1 or grid[rows - 1][cols - 1] == 1:
            return -1

        # 初始化队列
        queue = deque()
        queue.append((0, 0, 1))
        visited = set()
        visited.add((0, 0))

        directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]  # 右、下、左、上

        while queue:
            x, y, step = queue.popleft()
            if x == rows - 1 and y == cols - 1:
                return step  # 到达终点,返回结果

            for dx, dy in directions:
                new_x, new_y = x + dx, y + dy
                if 0 <= new_x < rows and 0 <= new_y < cols and grid[new_x][new_y] == 0 and (new_x, new_y) not in visited:
                    queue.append((new_x, new_y, step + 1))
                    visited.add((new_x, new_y))

        return -1  # 无法到达终点
时间复杂度和空间复杂度

时间复杂度:$O(N^2)$,其中 $N$ 是二维数组中的元素个数。

空间复杂度:$O(N)$。在 BFS 算法中,最多同时存在 $N$ 个节点需要加入队列,并且每个节点只访问一次,因此记录每个节点是否访问过的 visited 数组所需的空间也是 $O(N)$ 级别的。