首页 > 其他分享 >Leetcode 1926. 迷宫中离入口最近的出口

Leetcode 1926. 迷宫中离入口最近的出口

时间:2024-10-20 13:43:35浏览次数:1  
标签:entrance 遍历 BFS 层数 1926 maze que Leetcode 中离

1.题目基本信息

1.1.题目描述

给你一个 m x n 的迷宫矩阵 maze (下标从 0 开始),矩阵中有空格子(用 ‘.’ 表示)和墙(用 ‘+’ 表示)。同时给你迷宫的入口 entrance ,用 entrance = [entrancerow, entrancecol] 表示你一开始所在格子的行和列。

每一步操作,你可以往 上,下,左 或者 右 移动一个格子。你不能进入墙所在的格子,你也不能离开迷宫。你的目标是找到离 entrance 最近 的出口。出口 的含义是 maze 边界 上的 空格子。entrance 格子 不算 出口。

请你返回从 entrance 到最近出口的最短路径的 步数 ,如果不存在这样的路径,请你返回 -1 。

1.2.题目地址

https://leetcode.cn/problems/nearest-exit-from-entrance-in-maze/description/

2.解题方法

2.1.解题思路

广度优先搜索

2.2.解题步骤

第一步,构建广度优先搜索的队列

第二步,初始化entrance入口的已访问状态

第三步,BFS模板进行BFS遍历,并记录BFS的层数,BFS遍历找到出口时退出遍历,此时的层数即为步数;如果遍历完后,还是没找到结果,则返回-1

3.解题代码

Python代码

from collections import deque

class Solution:
    def nearestExit(self, maze: List[List[str]], entrance: List[int]) -> int:
        rows,cols=len(maze),len(maze[0])
        directs=[[-1,0],[0,-1],[1,0],[0,1]]
        # 第一步,构建广度优先搜索的队列
        entrance=tuple(entrance)
        que=deque([entrance])
        # 第二步,初始化entrance入口的已访问状态
        maze[entrance[0]][entrance[1]]="+"  # 初始化entrance为已经访问过
        result=0    # BFS遍历的层数
        # 第三步,BFS模板进行BFS遍历,并记录BFS的层数,BFS遍历找到出口时退出遍历,此时的层数即为步数;如果遍历完后,还是没找到结果,则返回-1
        while que:
            curLength=len(que)
            for _ in range(curLength):
                x,y=que.popleft()
                for direct in directs:
                    nx,ny=x+direct[0],y+direct[1]
                    npoint=(nx,ny)
                    if 0<=nx<rows and 0<=ny<cols and maze[nx][ny]!="+":
                        que.append(npoint)
                        maze[nx][ny]="+"  # 标记为已经参观过了(这里需要在入队前添加到已访问状态中,如果在pop处加入已访问状态,将导致队列中出现很多重复的元素,导致超时)
                        if nx in [0,rows-1] or ny in [0,cols-1]:
                            return result+1
            result+=1
        return -1

4.执行结果

在这里插入图片描述

标签:entrance,遍历,BFS,层数,1926,maze,que,Leetcode,中离
From: https://www.cnblogs.com/geek0070/p/18487189

相关文章

  • 讲解LeetCode第227题:基本计算器||(完整代码)
    LeetCode第227题:基本计算器||题目介绍方法一:数组模拟栈完整代码展示核心原理演示代码片段解释片段一:片段二:片段三:片段四:片段五:......
  • LeetCode第160:相交链表
    文章目录......
  • 闯关leetcode——125. Valid Palindrome
    大纲题目地址内容解题代码地址题目地址https://leetcode.com/problems/valid-palindrome/description/内容Aphraseisapalindromeif,afterconvertingalluppercaselettersintolowercaselettersandremovingallnon-alphanumericcharacters,itre......
  • [LeetCode] 1545. Find Kth Bit in Nth Binary String
    Giventwopositiveintegersnandk,thebinarystringSnisformedasfollows:S1="0"Si=Si-1+"1"+reverse(invert(Si-1))fori>1Where+denotestheconcatenationoperation,reverse(x)returnsthereversedstringx,an......
  • leetcode:有效的数独
    题目:有效的数独link:https://leetcode.cn/problems/valid-sudoku/description/?envType=study-plan-v2&envId=top-interview-150defisValidSudoku(self,board:List[List[str]])->bool:rows=[[0foriinrange(9)]forjinrange(9)]colou......
  • leetcode:螺旋矩阵
    2024-10-19 https://leetcode.cn/problems/spiral-matrix/description/?envType=study-plan-v2&envId=top-interview-150   1classSolution:2defspiralOrder(self,matrix:List[List[int]])->List[int]:34m=len(matrix)5......
  • leetcode:栈和队列oj题
    目录1.有效的括号2.用队列实现栈                                        3.用栈实现队列                              ......
  • LeetCode热题100|买卖股票的最佳时机(贪心)
    简述题意省流版:在一个序列里找到max(a[i]-a[k])且i>k。解题思路:  遍历这个序列,i表示当前遍历到了第i个元素,min1表示1到i这个范围内最小的元素,max1表示1到i这个范围内最大的【max(a[i]-a[k])】。max1=max(max1,第i个元素的值-min1)代码如下:classSolution{public:intm......
  • LeetCode 707 - 设计链表
    题目描述你可以选择使用单链表或者双链表,设计并实现自己的链表。单链表中的节点应该具备两个属性:val 和 next 。val 是当前节点的值,next 是指向下一个节点的指针/引用。如果是双向链表,则还需要属性 prev 以指示链表中的上一个节点。假设链表中的所有节点下标从 0 ......
  • Leetcode 1129. 颜色交替的最短路径
    1.题目基本信息1.1.题目描述给定一个整数n,即有向图中的节点数,其中节点标记为0到n–1。图中的每条边为红色或者蓝色,并且可能存在自环或平行边。给定两个数组redEdges和blueEdges,其中:redEdges[i]=[a_i,b_i]表示图中存在一条从节点a_i到节点b_i的红色有向边,bl......