当前位置: 首页 > 后端技术 > Python

力扣-1091.二次制阵中的最短路径【Python】

时间:2023-03-25 23:49:11 Python

LeetCode1091.二进制矩阵中的最短路径二进制阵中的最短路径【Medium】【Python】【BFS】问题LeetCode在一个N乘N的方格中,每个单元格要么是空的,要么是空的(0)或阻塞(1)。当且仅当它由单元格C_1、C_2、...、C_k组成时,从左上角到右下角的清晰路径的长度为k,这样:相邻的单元格C_i和C_{i+1}在8方向上连接(即,它们不同并且共享边或角)C_1位于位置(0,0)(即具有值grid[0][0])C_k位于位置(N-1,N-1)(ie.hasvaluegrid[N-1][N-1])如果C_i位于(r,c),则grid[r][c]为空(即grid[r][c]==0).返回从左上角到右下角的最短畅通路径的长度。如果这样的路径不存在,则返回-1。例1:输入:[[0,1],[1,0]]输出:2例2:输入:[[0,0,0],[1,1,0],[1,1,0]]Output:4注:1<=grid.length==grid[0].length<=100grid[r][c]is0or1问题力扣在一个N×N的方格网格式中,每个元格有两种状态:空(0)或阻塞(1)。一条从左上角到右下角长度为k的无障碍路径,由满足以下条件的cellsC_1,C_2,...,C_k组成:八个方向上相邻的cellsC_i和C_{i+1}之一aboveconnected(此时C_i和C_{i+1}不同,共享一条边或角)C_1位于(0,0)(即值grid[0][0])C_k位于(N-1,N-1)(即值grid[N-1][N-1])如果C_i在(r,c),则grid[r][c]为空(即grid[r][c]==0)返回从左上角到右下角的最短无障碍路径的长度。如果不存在这样的路径,则返回-1。示例1:输入:[[0,1],[1,0]]输出:2示例2:输入:[[0,0,0],[1,1,0],[1,1,0]]Output:4Tips:1<=grid.length==grid[0].length<=100grid[i][j]为0或1BFS最短路径问题可以使用BFS求解。直接在队列中添加路径长度cnt即可。BFStemplatevoidBFS(){判断边界条件是否可以直接返回结果。定义一个队列;定义备忘录,记录去过的地点;将起始位置添加到队列中并同时更新备忘录。while(队列不为空){获取当前队列中的元素个数。判断是否到达终点位置。for(元素个数){取出一个位置节点。判断是否到达终点位置。获取它对应的所有下一个节点。条件判断,过滤掉不符合条件的仓位。新位置重新加入队列。}}}BFS模板地址时间复杂度:O(N^2)空间复杂度:O(N^2)Python3代码类解决方案:defshortestPathBinaryMatrix(self,grid:List[List[int]])->int:ifgrid[0][0]==1orgrid[-1][-1]==1:#top-leftisnotemptyorbottom-rightisnotemptyreturn-1#八个方向:→←↓↑↗↙↖↘方向=[[1,0],[-1,0],[0,-1],[0,1],[1,1],[1,-1],[-1,1],[-1,-1]]queue=[(0,0,1)]#location,cntn=len(grid)#BFSwhilelen(queue):x0,y0,cnt=queue.pop(0)#pop(location,cnt)ifx0==n-1andy0==n-1:#已经到达右下角returncnt#i,j的八个方向indirections:x,y=x0+i,y0+j#(x,y)在grid中并且grid[x][y]=0,也意味着:如果0<=x