当前位置: 代码迷 >> 综合 >> LeetCode 1091:二进制矩阵中的最短路径
  详细解决方案

LeetCode 1091:二进制矩阵中的最短路径

热度:89   发布时间:2023-12-08 05:41:16.0

题目描述

给你一个 n x n 的二进制矩阵 grid 中,返回矩阵中最短 畅通路径 的长度。如果不存在这样的路径,返回 -1 。
二进制矩阵中的 畅通路径 是一条从 左上角 单元格(即,(0, 0))到 右下角 单元格(即,(n - 1, n - 1))的路径,该路径同时满足下述要求:

  • 路径途经的所有单元格都的值都是 0 。
  • 路径中所有相邻的单元格应当在 8 个方向之一 上连通(即,相邻两单元之间彼此不同且共享一条边或者一个角)。
  • 畅通路径的长度 是该路径途经的单元格总数。

解题思路

DFS和BFS都可以解决路径搜索的问题。但是若想知道一些关于“最近/最快/最少”之类问题的答案,往往采用 BFS 更加适合。因为DFS要多次遍历,搜索所有可能路径,标识做了之后还要取消,而DFS每个结点只访问一遍。

class Solution:def shortestPathBinaryMatrix(self, grid: List[List[int]]) -> int:m,n=len(grid),len(grid[0])moves=[(-1,1),(-1,0),(-1,-1),(0,1),(0,-1),(1,1),(1,0),(1,-1)]if grid[0][0]:return -1import collectionsqueue=collections.deque()queue.append((0,0))min_path=1grid[0][0]=1while queue:t=len(queue)while t>0:x,y=queue.popleft()if x==m-1 and y==n-1:return min_pathfor move in moves:x1,y1=x+move[0],y+move[1]if 0<=x1<m and 0<=y1<n and grid[x1][y1]==0:queue.append((x1,y1))grid[x1][y1]=1t-=1min_path+=1return -1

可以发现这其实和二叉树的层次遍历差不多,区别就是二叉树搜索的是左右两个节点,而求最短路径是搜索上下左右八个方向的节点。那么求最短路径就类似于求二叉树的深度了(层数=路径长度)。