📅  最后修改于: 2023-12-03 15:23:29.436000             🧑  作者: Mango
给定一个大小为 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。