【LeetCode75】第四十七题 迷宫中离入口最近的出口

news2024/11/27 12:30:33

目录

题目:

示例:

分析:

代码:


题目:

示例:

分析:

题目给我们一个数组形式的地图,让我们找出离入口最近的出口,出口就是地图的边界。

那么这道题可以使用DFS也可以BFS,不过DFS是暴力解法,需要把所有能走的路都走一边,所以会超时,因此我们只能使用BFS,BFS虽然也是暴力解法,不过我们要找的是最短路径,所以使用BFS一找到出口就可以直接返回路径长度,不需要把所有路都走一遍,所以比DFS要更快。

不过我这里就大概的把DFS和BFS都稍微讲一下。

DFS的话就是用的递归,每次都向四个方向再次递归,并且需要将地图中当前的位置重置为墙来避免重复递归到同一个地方,在递归中直到遇到墙就直接退出本次递归,或者是遇到了地图的边缘也就是到了出口,我们就记录一下路径,和答案的最短路径比较一下,更新为较小的值。

最后DFS完毕,我们将记录的最短路径返回即可,不过超时,因为DFS会遍历所有能从入口走到的地方。

而BFS是像辐射状向入口四周的能走的路开始扩散,BFS是使用队列来存每次要遍历的地方的,我们存进队列的是地点坐标以及路径长度的。

首先是将入口入队,入队的同时需要将地图中的入口位置置为墙,和上面DFS一样,为了避免重复 走同一条路。

 每次我们都将队列里的地点取出,接着向四个方向辐射,如果为墙则跳过,如果不为墙就判断一下是否为出口,为出口就直接把队列里取出的路径+1返回接口。否则就开始入队进入下一轮BFS,并且也是需要修改地图为墙。

最后直到队列为空,则表示我们BFS完毕,那么就是找不到出口,就返回-1就可以了。

总结一下,寻找有没有出口用DFS,寻找出口的最短路径用BFS。

代码:

class Solution {
public:
    //DFS
    int res=INT_MAX;
    void digui(vector<vector<char>>& maze,int x,int y,int time){
        if(time>=res || x<0||x>=maze.size()||y<0||y>=maze[0].size()||maze[x][y]=='+') return;
        if((x==0||x==maze.size()-1||y==0||y==maze[0].size()-1)&& time!=0){
            res=min(res,time);
            return;
        }
        maze[x][y]='+';
        digui(maze,x+1,y,time+1);
        digui(maze,x,y+1,time+1);
        digui(maze,x,y-1,time+1);
        digui(maze,x-1,y,time+1);
        maze[x][y]='.';
    }
    int nearestExit(vector<vector<char>>& maze, vector<int>& entrance) {
        digui(maze,entrance[0],entrance[1],0);
        return res!=INT_MAX?res:-1;
    }

    //BFS
    int nearestExit(vector<vector<char>>& maze, vector<int>& entrance) {
        int m = maze.size();
        int n = maze[0].size();
        // 上下左右四个相邻坐标对应的行列变化量
        vector<int> dx = {1, 0, -1, 0};
        vector<int> dy = {0, 1, 0, -1};
        queue<vector<int>> q;
        q.push({entrance[0], entrance[1], 0});  //入口入队
        maze[entrance[0]][entrance[1]] = '+';   //修改为墙避免重复走
        while (!q.empty()){  
            vector<int>temp = q.front();
            q.pop();
            // 遍历四个方向相邻坐标
            for (int k=0;k<4;k++){
                int newx = temp[0]+dx[k];
                int newy = temp[1]+dy[k];
                // 如果坐标不越界且并且不为墙
                if (newx >= 0 && newx < m && newy >= 0 && newy < n && maze[newx][newy] == '.'){
                    if (newx == 0 || newx == m - 1 || newy == 0 || newy == n - 1){  //如果走到了出口,那么返回
                        return temp[2] + 1;
                    }
                    q.push({newx, newy, temp[2]+1});    //新坐标入队
                    maze[newx][newy]='+';   //避免重复,修改为墙
                }
            }
        }
        return -1;
    }
};

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

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

相关文章

Vue+elementUI 导出word打印

import JSZipUtils from "jszip-utils"; import JSZip from "pizzip"; import Docxtemplater from "docxtemplater"; npm安装以上依赖 首先维护个word模板 导出方法 //导出wordskipOutWord(row) {var printData rowconst data JSON.parse(JS…

作品集(陆续上传中)

智能家居---不断完善中 家居-CSDN直播 家居 语音刷抖音 --- 基于串口和adb 基于守护进程的语音刷抖音-CSDN直播 基于守护进程的语音刷抖音 海天一色项目 --- 船舶靠港零碳排加热器 FTP云盘 --- 多进程和socket FTP云盘-CSDN直播 FTP云盘

JS 删除数组中的第一项和最后一项

JS 删除数组中的第一项和最后一项 需求分析 需求 JS 删除数组中的第一项和最后一项 分析 删除数组第一个元素 array.shift() /* 1. shift() 方法用于把数组的第一个元素从其中删除。 2. 返回值&#xff1a; 被删除的元素&#xff08;即数组原来的第一个元素的值&#xff09;。…

Unity——LitJSON的安装

一、LitJSON介绍 特点 LitJSON是一个轻量级的C# JSON库&#xff0c;用于在Unity游戏开发中进行JSON数据的序列化和反序列化操作。它提供了简单而高效的接口&#xff0c;帮助开发者处理JSON数据。 以下是LitJSON库的一些主要特点和功能&#xff1a; 1. 高性能&#xff1a;Lit…

死锁是什么?死锁的字节码指令了解?

用幽默浅显的言语来说死锁 半生&#xff1a;我已经拿到了机考的第一名&#xff0c;就差笔试第一名了 小一&#xff1a;我已经拿到了笔试的第一名&#xff0c;就差机考第一名了 面试官&#xff1a;我很看好你俩&#xff0c;继续"干", 同时拿到2个的第一名才能拿到offe…

华为云云服务器评测|基于云服务器的minio部署手册

华为云云服务器评测|基于云服务器的minio部署手册 【软件安装版本】【集群安装&#xff08;是&#xff09;&#xff08;否&#xff09;】 版本 创建人 修改人 创建时间 备注 1.0 jz jz 2023.9.2 minio华为云耀服务器 一. 部署规划与架构 1. 规…

降低LLM的幻觉风险:实用策略与技术

一、前言 近年来&#xff0c;大语言模型的快速发展为构建更智能和更人性化的AI系统提供了很多可能性。像GPT-3.5、GPT-4、Bard、Claude 2和LLaMa 2等大语言模型 (LLM) 在个人助理或聊天机器人应用领域展示了强大的潜力&#xff0c;可以生成流畅而令人惊叹的响应来回答用户的问…

新学期第一篇博客

文章目录 一、加入QQ群&#xff08;一&#xff09;QQ群号&#xff08;二&#xff09;加群要求 二、加入云班课三、使用思维导图&#xff08;一&#xff09;下载XMind软件&#xff08;二&#xff09;安装XMind软件&#xff08;三&#xff09;创建思维导图1、选择模板&#xff08…

【C++】拷贝对象时,编译器的偷偷优化

你知道吗&#xff1f;对于连续的”构造拷贝构造“&#xff0c;编译器其实是会默默做出优化的。&#x1f47b; 如果你不知道这个知识点的话&#xff0c;那下面这道笔试题就要失分了&#x1f635;。 本篇分享一个关于编译器优化的小知识&#xff0c;看完本篇&#xff0c;你就能…

阿里云服务器退款规则_退款政策全解析

阿里云退款政策全解析&#xff0c;阿里云退款分为五天无理由全额退和非全额退订两种&#xff0c;阿里云百科以云服务器为例&#xff0c;阿里云服务器包年包月支持五天无理由全额退订&#xff0c;可申请无理由全额退款&#xff0c;如果是按量付费的云服务器直接释放资源即可。阿…

C++ Primer Plus 第六章笔记

目录 if 语句 if else语句 if else if else结构 逻辑运算符--&&,||和! cctype字符函数库 条件运算符&#xff08;三目运算符) switch语句 continue和break语句 基本文件输入/输出 总结&#xff1a;本文主要介绍了分支语句和if判断语句&#xff0c;运算符和简…

vue 浏览器记住密码后,自动填充账号密码错位

亲测有效&#xff01;&#xff01;! 遇到的场景&#xff1a; 浏览器记住密码后&#xff0c;登录时自动填充账号密码&#xff0c;由于登录时只需要这两个字段所以没问题&#xff0c;见图一&#xff0c;但注册时&#xff0c;账号密码不在一处&#xff0c;见图二 原本账号应该在…

浅谈JVM内存模型与GC垃圾回收

目录 1. 摘要 2. JVM 简单介绍 3. 线程私有的有哪些&#xff1f; 4. 线程共享的有哪些&#xff1f; 5. JVM 栈中程序是如何操作数据的&#xff1f; 6. 内存泄露是什么意思&#xff1f; 7. 堆内存的分配规则 8. 垃圾回收算法 8.1 垃圾回收机制简单概括 8.2 标记清理算法…

UNIAPP之js/nvue混淆探索

因项目需要对UNIAPP的js混淆做了一些调研 混淆教程: https://uniapp.dcloud.net.cn/tutorial/app-sec-confusion.html 按照教程配置进行打包正式包进行混淆 下载正式包将 .ipa改为.zip 解压获取到HBuilder.app 右键显示包内容 获取到混淆的key 不同时间进行打包混淆同一文…

谷器数据被认证为全国信标委软工分委会全权成员单位

8月23日&#xff0c;全国信息技术标准化技术委员会软件与系统工程分技术委员会&#xff08;简称&#xff1a;全国信标委软工分委会&#xff0c;SAC/TC28/SC7&#xff09;批准通过新一批成员单位&#xff0c;北京谷器数据科技有限公司被成功授牌为全权成员单位。 全国信标委软件…

高校消防安全存在的问题与解决方案介绍 安科瑞 许敏

摘要 &#xff1a;本文分析了当前高校消防安全存在的问题&#xff0c;现有消防系统突出问题表现形式&#xff0c;提出高校智慧消防安全预警防控体系构建&#xff0c;并对智慧消防安全预警平台主要功能进行了简介&#xff0c;对高校智慧消防安全预警系统功能设计具有一定的指导意…

0基础学习VR全景平台篇 第96篇:VR电子楼书

大家好&#xff0c;欢迎观看蛙色VR官方系列课程——VR电子楼书&#xff01; 作为2021年底全新上线的行业解决方案&#xff0c;是专门针对地产、园区数字化营销的一站式VR解决方案&#xff0c;为行业潜在客户提供优质的7x24小时线上看房体验。 本期教程将通过功能介绍后台操作&…

koa2快速2分钟搭建web服务器

koa简介&#xff1a; Koa是一个基于Node的web服务web服务器开发框架。类似于Express。 Koa1它的主要特点是&#xff0c;使用了ES6的Generator函数。 koa2依赖Node.js 7.6.0或者更高版本。 koa不在内核方法中绑定任何中间件&#xff0c;它仅仅是一个轻量级的函数库&#xff0c;几…

【QT】QMessageBox消息框的使用(16)

在实际项目中&#xff0c;弹出消息框是一个很常见的操作&#xff0c;包含错误信息提示、警告信息提示、关于信息提示、还包括判断信息选择等操作&#xff0c;那么今天通过这一节来好好了解下消息框的使用方法。 一.环境配置 1.python 3.7.8 可直接进入官网下载安装&#xf…

图:关键路径

1. AOE网 与AOV网不同&#xff0c;AOE是用边表示活动的图或者网。 1.AOE网的概念 在带权有向图中&#xff0c;以顶点表示事件&#xff0c;以有向边表示活动&#xff0c; 以边上的权值表示完成该活动的开销(如完成活动所需的时间)&#xff0c; 称之为用边表示活动的网络&…