📌  相关文章
📜  在二进制矩阵的中心得到 1 的最小步骤(1)

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

在二进制矩阵的中心得到 1 的最小步骤

问题描述

给定一个大小为 n x n 的二进制矩阵 grid,其中 1 表示陆地,0 表示海洋。grid 的每一条边界都被水包围。

你可以在陆地上以 4 个方向之一上、下、左、右开始无限循环。你的目标是在学习所有可能的路径后,返回位于网格中心的陆地单元格的最小步数。

如果无法到达网格中心,则返回 -1。

解法思路

由于题目中要求最短路径,我们可以使用广度优先搜索(BFS)算法来解决这个问题。

首先从矩阵的中心位置开始进行搜索。将中心点放入队列中,然后将距离它最近的四个方向的陆地点加入队列,由于是最短路径,我们要用 visited 数组记录已经访问过的陆地点,防止重复访问。

接下来,每次从队列中取出一个点,然后将距离它最近的四个方向的陆地点加入队列,同时更新 visited 数组和 steps 数组。重复这个过程,直到找到网格中心的陆地单元格,或队列为空。如果队列为空,说明无法到达网格中心。

代码实现
class Solution:
    def shortestPathBinaryMatrix(self, grid: List[List[int]]) -> int:
        n = len(grid)
        if grid[0][0] != 0 or grid[-1][-1] != 0:
            return -1
        queue = [(0, 0)]
        visited = set()
        visited.add((0, 0))
        steps = {(0, 0): 1}
        directions = [(0, 1), (0, -1), (1, 0), (-1, 0)]
        while queue:
            x, y = queue.pop(0)
            if x == y == n - 1:
                return steps[(x, y)]
            for dx, dy in directions:
                newx, newy = x+dx, y+dy
                if 0 <= newx < n and 0 <= newy < n and (newx, newy) not in visited and grid[newx][newy] == 0:
                    steps[(newx, newy)] = steps[(x, y)] + 1
                    queue.append((newx, newy))
                    visited.add((newx, newy))
        return -1

代码中,我们先判断矩阵左上角和右下角是否为陆地,如果不是,直接返回 -1。接下来,使用双向队列来存储已经访问过的陆地点,使用 visited 集合来判断一个点是否已经被访问过,防止重复访问。使用 steps 字典来记录每个点到起点的最短路径。

在每次从队列取出一个点时,我们遍历这个点的四个方向,如果该方向的点为陆地并且没有被访问过,那么把它加入队列中,同时更新 visited 和 steps 数组。最后如果队列为空,说明无法到达网格中心,我们返回 -1。