leetcode 1926. Nearest Exit from Entrance in Maze(迷宫最近的出口)

news2025/1/16 6:44:16

在这里插入图片描述
Input: maze = [[“+”,“+”,“.”,“+”],[“.”,“.”,“.”,“+”],[“+”,“+”,“+”,“.”]], entrance = [1,2]
Output: 1
Explanation: There are 3 exits in this maze at [1,0], [0,2], and [2,3].
Initially, you are at the entrance cell [1,2].

  • You can reach [1,0] by moving 2 steps left.
  • You can reach [0,2] by moving 1 step up.
    It is impossible to reach [2,3] from the entrance.
    Thus, the nearest exit is [0,2], which is 1 step away.
    在这里插入图片描述
    给一个迷宫,“.“代表此路可走,”+“代表此路不通,
    给一个entrance的位置作为初始位置。
    从初始位置出发,走到迷宫的边界处,如果边界处是“.”, 就说明到达了出口,返回最短的路径。
    初始位置即使在边界处,也不能算作出口。
    如果不存在能走出去的路径,返回-1.
思路:

第一时间想到的竟然是DFS而不是BFS。
下面来说明DFS是如何TLE的。虽然走不通,但是还是过一下。
DFS流程是下面这样的,
注意当前节点访问完,visited要变回false, 不然当前路径即使尝试失败,后面其他路径再想经过也会被堵。

int dfs(char[][] maze, int r, int c, boolean[][] visited, int steps) {
    if(r < 0 || c < 0 || r > m || c > n) return 1000;
    if(visited[r][c] || steps >= 1000) return 1000;
    if(maze[r][c] == '+') return 1000;
    
    
    if((r == 0 || r == m || c == 0 || c == n) && maze[r][c] == '.') {     
        steps ++;
        return steps;
    }
    
    visited[r][c] = true;
    steps ++;
    
    int step1 = dfs(maze, r-1, c, visited, steps);
    int step2 = dfs(maze, r, c+1, visited, steps);
    int step3 = dfs(maze, r+1, c, visited, steps);
    int step4 = dfs(maze, r, c-1, visited, steps);
    visited[r][c] = false;
    
    return Math.min(Math.min(step1, step2), Math.min(step3, step4));
}

来看看DFS为神马会TLE。
在这里插入图片描述

从(17, 15)的"E"处出发,
如果是DFS,先探索从(16, 15)出发的路径的话,那可有得探索了,上面各种尝试,然而绕一大圈回来发现出口就在家门口。
那你说我改个方向,先探索从(17, 16)出发的路径,那么这个case是没问题了,entrance如果在第0列不还是会有这个问题么。

这种找最短路径,要突出一个短,按半径从小到大一圈一圈搜索,更容易快速找到出口。

BFS中有个问题是什么时候设置visited flag? 是访问到当前节点的时候,还是把下一节点装入queue的时候?
帮你们做了个实验,访问当前节点的时候steps++ 会 TLE,
为什么,因为装入queue就说明下一轮即将被访问,此时不设visited, 那该节点可能会被重复装入queue。

也可以不用visited二维数组,直接把访问过的地方设为“ + “ 也是一样的效果,不过就会改变原maze数组了。

    public int nearestExit(char[][] maze, int[] entrance) {
        int m = maze.length;
        int n = maze[0].length;
        Queue<int[]> queue = new LinkedList<>();
        int steps = 0;
        int[] direc = new int[]{-1, 0, 1, 0, -1};
        boolean[][] visited = new boolean[m][n];
        visited[entrance[0]][entrance[1]] = true;
        
        queue.offer(entrance);
        
        while(!queue.isEmpty()) {
            steps ++;
            int size = queue.size();
            
            for(int s = 0; s < size; s++) {
                int[] cur = queue.poll();
                //visited[cur[0]][cur[1]] = true; //不要在这里设为true

                for(int i = 0; i < 4; i++) {
                    int nextR = cur[0] + direc[i];
                    int nextC = cur[1] + direc[i+1];

                    if(nextR < 0 || nextR >= m || nextC < 0 || nextC >= n) continue;
                    if(visited[nextR][nextC]) continue;
                    if(maze[nextR][nextC] == '+') continue;
                    if(nextR == 0 || nextR == m-1 || nextC == 0 || nextC == n-1) return steps;

                    visited[nextR][nextC] = true;  //装入queue时设为true,防止节点被重复装入queue
                    queue.offer(new int[]{nextR, nextC});
                }
            }   
        }
        
        return -1;
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/24118.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大模型产业化有四个关键,昇腾AI推动“AI+遥感”打了个样

文|智能相对论 作者|夜远风 农业卫星在太空“拍下”地面这张“照片”&#xff0c;地面根据这些图像数据&#xff0c;结合气象情况等&#xff0c;通过AI算法就准确地“算”出了农作物的长势状况&#xff0c;给地方政府、种地农民以参考。 &#xff08;图&#xff1a;农业用地的…

uni-app入门:页面布局之window和tabbar

1.window 2.tabbar 3.全局配置与局部页面配置 前言 每个页面按照结构可以分成三部分:window page tabbar.其中window和tabbar一般比较固定&#xff0c;page是平常业务开展的主要载体&#xff0c;根据业务需求进行页面配置。下面主要讲一下window和tabbar。 1.window…

【苹果相册】苹果推从新建的私钥CSR文件Profile还分为开发和分发

推荐内容IMESSGAE相关 作者推荐内容iMessage苹果推软件 *** 点击即可查看作者要求内容信息作者推荐内容1.家庭推内容 *** 点击即可查看作者要求内容信息作者推荐内容2.相册推 *** 点击即可查看作者要求内容信息作者推荐内容3.日历推 *** 点击即可查看作者要求内容信息作者推荐…

A-Level经济例题解析及练习

今日知识点&#xff1a; Externality and Government Intervention 例题 Externality and Government Intervention Acme and US Electric run coal-burning power plants. Each emits 40 tons of sulphur dioxide per month, total emissions 80 tons/month. Goal: Redu…

EXCEL函数

1.文本函数 1.2 LEFT() 概念&#xff1a;从文本字符串的第一个字符开始返回指定个数的字符。 例子&#xff1a;编辑此文本&#xff1a;忍一时风平浪静&#xff0c;退一步越想越气。 此处的H1即代表该文本&#xff0c;下面函数举例同样如此&#xff1a; 操作&#xff1a;LEFT(…

Magisk搞机器记录(小米Mix3)

背景 最近咸鱼入手了一块8256的小米Mix3手机&#xff0c;于是开始进行愉快的搞机之旅。笔者也是第一次玩&#xff0c;查阅了很多资料&#xff0c;如有错误的地方&#xff0c;还请大佬们指出来。 调研 经过大概的了解&#xff0c;大概就是解锁&#xff0c;获取Root权限&#…

机器学习笔记之高斯分布(五)推断任务之边缘概率分布与条件概率分布

机器学习笔记之高斯分布——推断任务之边缘概率分布与条件概率分布引言回顾&#xff1a;卡尔曼滤波高斯分布与线性计算的相关定理任务目标与推导过程任务目标求解边缘概率分布求解条件概率分布引言 上一节介绍了高斯分布概率模型相关的推断问题&#xff0c;并详细介绍了给定联…

RabbitMQ系列【12】惰性队列

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 文章目录前言设置为惰性队列内存开销对比前言 默认情况下&#xff0c;当生产者将消息发送到 RabbitMQ 的时候&#xff0c;队列中的消息会尽可能的存储在内存之中&#xff0c;这样可以更加快速的将消息发…

CTFHub技能树 Web-SQL注入详解

文章目录0x01 整数型注入0x02 字符型注入0x03 报错注入0x04 布尔盲注0x05 时间盲注0x06 MySql结构0x07 Cookie注入0x08 空格绕过0x09 UA注入0x10 Refer注入总结摘抄0x01 整数型注入 解题WP 第一步 尝试闭合点 第二步 判断列数 id1 order by 2 页面正常 id1 order by 3 页面…

C语言中的文件操作

在今天的文章中&#xff0c;我将要讲解C语言里的文件操作的详细知识。 目录1.为什么使用文件2.什么是文件2.1程序文件2.2数据文件2.3文件名3.文件的打开和关闭3.1文件指针3.2文件的打开和关闭3.2.1 fopen函数3.2.2 fclose函数3.2.3 文件的打开方式4.文件的顺序读写4.1 文件输入…

高通量筛选——离子化合物

上线离子通道筛选平台&#xff0c;提供形式多样的高表达细胞系的离子通道检测及新药临床前离子通道作用评价服务。 离子通道离子通道 (Ion Channel) 是一类跨膜的大分子孔道蛋白&#xff0c;可允许特定类型离子在电化学梯度驱动下穿过细胞膜&#xff0c;从而完成信号传导、细…

罗丹明PEG巯基,Rhodamine PEG Thiol,RB-PEG-SH

产品名称&#xff1a;罗丹明PEG巯基 英文名称&#xff1a;Rhodamine PEG Thiol&#xff0c;RB-PEG-SH 罗丹明B-PEG巯基&#xff08;RB-PEG-SH&#xff09;可以用来修饰蛋白质、多肽以及其他材料或者小分子。马来酰亚胺和巯基&#xff08;-SH&#xff09;在PH6.5-7.5很容易形成…

JAVA maven

Maven基础 Maven的本质是一个项目管理工具&#xff0c;将项目开发和管理过程抽象成一个项目对象模型&#xff08;POM&#xff09; POM(Project Object Model&#xff09;&#xff1a;项目对象模型。 项目对象模型&#xff08;POM&#xff09;需要加载pom.xml来确定项目&#x…

【SpringBoot笔记27】SpringBoot集成ES数据库之操作index索引(创建、删除、获取)

这篇文章&#xff0c;主要介绍SpringBoot如何操作ES数据库中的index索引&#xff08;创建、删除、获取&#xff09;。 目录 一、SpringBoot操作ES索引 1.1、创建索引 1.2、删除索引 1.3、获取索引 1.4、判断索引是否存在 一、SpringBoot操作ES索引 ES的高级客户端中&…

一、数据库查询语句(单表查询篇)

一、数据库查询语句(单表查询篇) 单表查询&#xff1a;SELECT 语句仅从一个表/视图中检索数据&#xff0c;称单表查询。即其中的<普通表> 使用的是[<模式名>.]<基表名|视图名>。 该查询的语句所依赖的表是创建数据库实例默认勾选的两个实例&#xff1a;BOOKS…

Python数据分析实战-实现txt文件与列表(list)相互读写转换(附源码和实现效果)

前面我介绍了可视化的一些方法以及机器学习在预测方面的应用&#xff0c;分为分类问题&#xff08;预测值是离散型&#xff09;和回归问题&#xff08;预测值是连续型&#xff09;&#xff08;具体见之前的文章&#xff09;。 从本期开始&#xff0c;我将做一个数据分析类实战…

python对指定字符串逆序的几种方法

对于一个给定的字符串&#xff0c;逆序输出&#xff0c;这个任务对于python来说是一种很简单的操作&#xff0c;毕竟强大的列表和字符串处理的一些列函数足以应付这些问题 了&#xff0c;今天总结了一下python中对于字符串的逆序输出的6种常用的方法 方法一&#xff1a;直接使…

04 数学软件与建模---Lingo

(12条消息) Lingo学习笔记&#xff08;一&#xff09;——语法入门_小白成长之旅的博客-CSDN博客 1.在LINGO中求解如下的LP问题&#xff1a; min2*x13*x2; x1x2>350; x1>100; 2*x1x2<600; 2.LINGO中的集 2.1 集的定义 对实际问题建模的时候&#xff0c;总会遇到一群…

java单例模式--懒汉式、饿汉式(第二次学习)

目录 java单例模式--懒汉式、饿汉式 1、要点 2、单例模式的类型&#xff08;五种&#xff09; 2.1 饿汉式 2.2 枚举饿汉式&#xff08;推荐使用&#xff09; 2.3 懒汉式单例 2.4 DCL懒汉式&#xff08;双检锁的懒汉式&#xff09; 2.5 内部类懒汉式&#xff08;推荐使用…

vue2 sass 安装及使用2

根据上一篇 vue2 sass 安装及使用_lsswear的博客-CSDN博客&#xff0c;使用vue-cli 5版本继续尝试安装sass。 本地环境&#xff1a; win10 vue2 vue-cli 5 sass安装 vue create testsass npm i node-loaderadded 2 packages in 6snpm i sass-loaderadded 1 package in 3s…