每日OJ题_BFS解决最短路①_力扣1926. 迷宫中离入口最近的出口

目录

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

解析代码


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

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

难度 中等

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

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

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

示例 1:

输入:maze = [["+","+",".","+"],[".",".",".","+"],["+","+","+","."]], entrance = [1,2]
输出:1
解释:总共有 3 个出口,分别位于 (1,0),(0,2) 和 (2,3) 。
一开始,你在入口格子 (1,2) 处。
- 你可以往左移动 2 步到达 (1,0) 。
- 你可以往上移动 1 步到达 (0,2) 。
从入口处没法到达 (2,3) 。
所以,最近的出口是 (0,2) ,距离为 1 步。

示例 2:

输入:maze = [["+","+","+"],[".",".","."],["+","+","+"]], entrance = [1,0]
输出:2
解释:迷宫中只有 1 个出口,在 (1,2) 处。
(1,0) 不算出口,因为它是入口格子。
初始时,你在入口与格子 (1,0) 处。
- 你可以往右移动 2 步到达 (1,2) 处。
所以,最近的出口为 (1,2) ,距离为 2 步。

示例 3:

输入:maze = [[".","+"]], entrance = [0,0]
输出:-1
解释:这个迷宫中没有出口。

提示:

  • maze.length == m
  • maze[i].length == n
  • 1 <= m, n <= 100
  • maze[i][j] 要么是 '.' ,要么是 '+' 。
  • entrance.length == 2
  • 0 <= entrancerow < m
  • 0 <= entrancecol < n
  • entrance 一定是空格子。
class Solution {
public:int nearestExit(vector<vector<char>>& maze, vector<int>& entrance) {}
};

解析代码

        利用层序遍历来解决迷宫问题,是最经典的做法。我们可以从起点开始层序遍历,并且在遍历的过程中记录当前遍历的层数。这样就能在找到出口的时候,得到起点到出口的最短距离。

class Solution {int dx[4] = {0, 0, -1, 1};int dy[4] = {1, -1, 0, 0};
public:int nearestExit(vector<vector<char>>& maze, vector<int>& entrance) {int m = maze.size(), n = maze[0].size(), ret = 0;vector<vector<bool>> vis(m, vector<bool>(n, false)); // 下标是否被访问过queue<vector<int>> q; // 存下标的队列q.push(entrance);   // 入口入队vis[entrance[0]][entrance[1]] = true;while(!q.empty()){++ret; // 一层加一次步数int size = q.size();for(int i = 0; i < size; ++i) // 访问当前层{vector<int> tmp = q.front();q.pop();for(int j = 0; j < 4; ++j){int x = tmp[0] + dx[j], y = tmp[1] + dy[j];if(x >= 0 && x < m && y >= 0 && y < n && maze[x][y] == '.' && !vis[x][y]){if(x == 0 || x == m - 1 || y == 0 || y == n - 1)return ret; // 是出口就返回q.push({x, y});vis[x][y] = true;}}}}return -1;}
};

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

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

相关文章

Hibernate入门经典与注解式开发大全

本博文主要讲解介绍Hibernate框架&#xff0c;ORM的概念和Hibernate入门&#xff0c;相信你们看了就会使用Hibernate了! 什么是Hibernate框架&#xff1f; Hibernate是一种ORM框架&#xff0c;全称为 Object_Relative DateBase-Mapping&#xff0c;在Java对象与关系数据库之间建…

【uniapp踩坑记】使用z-paging组件,微信小程序端加载不出来问题解决

使用z-paging组件&#xff0c;h5端加载正常&#xff0c;微信小程序端显示空白 今天做分页列表&#xff0c;在插件市场找到了z-paging&#xff0c;照着示例代码写了进去&#xff0c;在h5端能正常使用&#xff0c;在小程序端一直显示空白 尝试过以下无效操作&#xff1a; 1.清除所…

Scrapy 框架基础

Scrapy框架基础Scrapy框架进阶 Scrapy 框架基础 【一】框架介绍 【1】简介 Scrapy是一个用于网络爬取的快速高级框架&#xff0c;使用Python编写他不仅可以用于数据挖掘&#xff0c;还可以用于检测和自动化测试等任务 【2】框架 官网链接https://docs.scrapy.org/en/late…

WPS二次开发系列:WPS SDk功能就概览

作者持续关注WPS二次开发专题系列&#xff0c;持续为大家带来更多有价值的WPS开发技术细节&#xff0c;如果能够帮助到您&#xff0c;请帮忙来个一键三连&#xff0c;更多问题请联系我&#xff08;QQ:250325397&#xff09; 作者通过深度测试使用了WPS SDK提供的Demo&#xff0…

给你的 vscode 扩展增加测试设置

文章目录 1. 目的2. vitest 作为 vscode 扩展单元测试3. vscode-test 集成测试4. 自定义 Runner 集成测试5. 小结 1. 目的 vscode 作为当前最多人使用的编辑器和开发工具&#xff0c;其最强大之处就是有成熟的插件社区&#xff0c;但是使用过程中难免就会遇到插件功能不够称心…

Python 内置函数 format() 详解

在 Python 中&#xff0c;format() 是一个内置函数&#xff0c;用于格式化字符串。它提供了灵活的方式来将变量插入到字符串中&#xff0c;并控制它们的显示格式。让我们深入了解一下这个函数的用法、参数、示例以及注意事项。 1. format() 函数概述 format() 函数是 Python …

SPI 设备驱动编写流程:SPI 设备数据收发处理流程

一. 简介 前面一篇文章学习了SPI设备驱动数据收发过程中&#xff0c;涉及的结构体与函数&#xff0c;文章如下&#xff1a; SPI 设备驱动编写流程&#xff1a;SPI 设备数据收发处理流程中涉及的结构体与函数-CSDN博客 本文学习SPI设备驱动中数据收发处理过程。 二. SPI 设备…

P8649 [蓝桥杯 2017 省 B] k 倍区间(同余定理)

# [蓝桥杯 2017 省 B] k 倍区间 ## 题目描述 给定一个长度为 $N$ 的数列&#xff0c;$A_1,A_2, \cdots A_N$&#xff0c;如果其中一段连续的子序列 $A_i,A_{i1}, \cdots A_j(i \le j)$ 之和是 $K$ 的倍数&#xff0c;我们就称这个区间 $[i,j]$ 是 $K$ 倍区间。 你能求出数列…

ThreadX在STM32上的移植:通用启动文件tx_initialize_low_level.s

在嵌入式系统开发中&#xff0c;实时操作系统&#xff08;RTOS&#xff09;的选择对于系统性能和稳定性至关重要。ThreadX是一种广泛使用的RTOS&#xff0c;它以其小巧、快速和可靠而闻名。在本文中&#xff0c;我们将探讨如何将ThreadX移植到STM32微控制器上&#xff0c;特别是…

#381. 四边形继承练习

太爽了 甚至还现学了叉积判断线段是否相交和求面积的方法 先给出我的代码&#xff1a; #include <iostream> #include <vector> #include <iomanip> #include <cmath>using namespace std;//下面需要补充多个类的声明及实现代码 const double EPS 1…

创新营销利器:淘宝扭蛋机小程序开发全解析

在数字化浪潮的推动下&#xff0c;淘宝扭蛋机小程序的开发成为了一种全新的购物体验。它巧妙地将传统扭蛋机的乐趣与移动技术的便捷相结合&#xff0c;为用户带来了前所未有的惊喜与互动。 淘宝扭蛋机小程序的开发&#xff0c;不仅是一次技术的革新&#xff0c;更是一次购物方…

【基于HTML5的网页设计及应用】——事件代理.

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

gcn代码处理出现的问题

README 版本不一致 python 2.7 PYTHON 3.7 切换 TensorFlow系统的学习使用 数据集下载

每个人都可以做一个赚钱的社群

如何创建并运营一个赚钱的社群 一、引言 大家好&#xff0c;今天&#xff0c;我想和大家分享一下如何创建并运营一个赚钱的社群。我的分享目的是希望能够持续输出有价值的内容。 二、心态建设 1. 重要性&#xff1a;创业心态与平常心 在开始社群运营之前&#xff0c;我们需…

在线知识库如何从零开始搭建?这篇文章来教你!

引言&#xff1a; 有没有想过把那些零散在脑海中的点点滴滴整理起来&#xff0c;建立一个属于自己的在线知识库&#xff1f;无论是个人学习&#xff0c;团队协作&#xff0c;还是企业管理&#xff0c;一个良好的知识库都能帮我们更高效地存储和分享知识。如果你还在为“怎么建知…

持续上榜!赛宁网安多项能力入选《中国网络安全行业全景图》

4月12日&#xff0c;国内网安咨询机构安全牛正式发布《中国网络安全行业全景图》第十一版。赛宁网安凭借在网络安全领域前沿的技术创新优势、丰富的实践经验积累以及专业的综合安全服务&#xff0c;入选此次全景图安全支撑技术与体系的安全靶场领域、安全管理与运营的BAS领域和…

hierarchy-utils 通用树形数据工具库

通用树形数据工具库 hierarchy-utils链接地址使用示例数据结构 - 菜单数据源1.通过原数据结构返回树形数据2.通过转换数据结构&#xff08;Map / JSONObject&#xff09;返回树形数据3.返回源数据列表中id为rootId的元素或pid为rootId且id能整除2的全部子元素的数据列表 &#…

docker特殊问题处理3——docker-compose安装配置nacos

最近几年随着大数据和人工智能持续大热&#xff0c;容器化安装部署运维已经走进了各个中小公司&#xff0c;也得已让众多开发者能上手实际操作&#xff0c;不过说真心话&#xff0c;“万物皆可容器化”的理念越来越深入人心。 而如何使用docker-compose安装&#xff0c;配置&a…

Windows下安装GPU版Pytorch

升级Driver到最新版本 Windows搜索栏中输入设备管理器找到显示适配器一项&#xff0c;点击展开&#xff0c;你将看到你的NVIDIA显卡列在其中右键点击你的NVIDIA显卡&#xff0c;选择更新驱动软件…。在弹出的对话框中&#xff0c;选择自动搜索更新的驱动软件。之后&#xff0c…

html--烟花3

html <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>Canvas烟花粒子</title> <meta name"keywords" content"canvas烟花"/> <meta name"description" content"can…