LeetCode算法题(Go语言实现)_47

题目

给你一个 m x n 的迷宫矩阵 maze (下标从 0 开始),矩阵中有空格子(用 ‘.’ 表示)和墙(用 ‘+’ 表示)。同时给你迷宫的入口 entrance ,用 entrance = [entrancerow, entrancecol] 表示你一开始所在格子的行和列。
每一步操作,你可以往 上,下,左 或者 右 移动一个格子。你不能进入墙所在的格子,你也不能离开迷宫。你的目标是找到离 entrance 最近 的出口。出口 的含义是 maze 边界 上的 空格子。entrance 格子 不算 出口。
请你返回从 entrance 到最近出口的最短路径的 步数 ,如果不存在这样的路径,请你返回 -1 。

一、代码实现

func nearestExit(maze [][]byte, entrance []int) int {m := len(maze)if m == 0 {return -1}n := len(maze[0])if n == 0 {return -1}entranceRow, entranceCol := entrance[0], entrance[1]queue := [][]int{{entranceRow, entranceCol}}maze[entranceRow][entranceCol] = '+' // 标记为已访问directions := [][]int{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}steps := 0for len(queue) > 0 {levelSize := len(queue)for i := 0; i < levelSize; i++ {cell := queue[0]queue = queue[1:]row, col := cell[0], cell[1]for _, dir := range directions {newRow := row + dir[0]newCol := col + dir[1]// 检查边界if newRow < 0 || newRow >= m || newCol < 0 || newCol >= n {continue}// 检查是否可走且未访问if maze[newRow][newCol] == '+' {continue}// 检查是否是出口if isExit(newRow, newCol, entranceRow, entranceCol, m, n) {return steps + 1}// 标记为已访问并入队maze[newRow][newCol] = '+'queue = append(queue, []int{newRow, newCol})}}steps++}return -1
}func isExit(r, c, entranceR, entranceC, m, n int) bool {// 位于边界且不是入口return (r == 0 || r == m-1 || c == 0 || c == n-1) && !(r == entranceR && c == entranceC)
}

二、算法分析

1. 核心思路
  • 广度优先搜索(BFS):从入口出发分层扩展,首次到达边界即最短路径
  • 出口判定:当节点位于迷宫边界且非入口时视为合法出口
  • 状态管理:使用二维数组记录访问状态,避免重复遍历
2. 关键步骤
  1. 队列初始化:将入口位置加入队列,步数设为0
  2. 分层遍历:每次处理一层节点,检查是否符合出口条件
  3. 方向扩展:对合法相邻节点(非墙、未访问)进行入队
  4. 终止条件:队列为空时返回-1,表示无可行路径
3. 复杂度
指标说明
时间复杂度O(mn)最坏情况遍历所有节点
空间复杂度O(mn)维护访问数组和队列的空间消耗

三、图解示例

在这里插入图片描述

四、边界条件与扩展

1. 特殊场景验证
  • 入口即出口:入口在边界但不算出口,需寻找其他边界点
  • 全封闭迷宫:所有边界点均为墙,返回-1
  • 螺旋路径:需绕行多层后到达边界出口
2. 扩展应用
  • 动态障碍物:支持实时更新墙的位置后重新计算路径
  • 多出口优化:寻找所有出口中的最近/最远距离
  • 三维迷宫:扩展为三维空间的路径搜索问题
3. 其他语言
from collections import dequedef nearestExit(maze, entrance):m, n = len(maze), len(maze[0])directions = [(-1,0), (1,0), (0,-1), (0,1)]visited = [[False]*n for _ in range(m)]q = deque()# 初始化队列和访问状态ent_r, ent_c = entranceq.append((ent_r, ent_c, 0))visited[ent_r][ent_c] = Truewhile q:r, c, steps = q.popleft()# 判断当前节点是否为出口(边界且非入口)if (r == 0 or r == m-1 or c == 0 or c == n-1) and (r, c) != (ent_r, ent_c):return steps# 遍历四个方向for dr, dc in directions:nr, nc = r+dr, c+dcif 0 <= nr < m and 0 <= nc < n and not visited[nr][nc] and maze[nr][nc] == '.':visited[nr][nc] = Trueq.append((nr, nc, steps+1))return -1

五、总结与优化

1. 方法对比
方法优势劣势适用场景
BFS保证最短路径空间消耗较大常规迷宫搜索
DFS空间效率高无法保证最短路径路径存在性验证
A*算法启发式搜索效率高需设计启发函数大型迷宫优化搜索
2. 工程优化
  • 双向BFS:从入口和出口同时搜索,减少搜索空间
  • 压缩存储:使用位运算压缩访问状态数组
  • 并行计算:对多个方向进行并行路径探索
3. 算法扩展
  • 权重迷宫:不同路径消耗不同步数,寻找最小消耗路径
  • 移动模式:支持对角线移动或限定转向次数
  • 动态规划:预处理各点到边界的最短距离

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

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

相关文章

The Strict Teacher (Hard Version) 去除无效的干扰!巧妙转化

文章目录 The Strict Teacher (Hard Version) 思考问题&#xff01;那么多个人抓一个人&#xff0c;是否是每一个人都是对于最优策略的答案是有贡献的&#xff1f;答案是否定的&#xff0c;其实问题可以简化为三种情况&#xff1a; 所有的老师都在大卫的右边&#xff0c;…

《 Reinforcement Learning for Education: Opportunities and Challenges》全文阅读

Reinforcement Learning for Education: Opportunities and Challenges 面向教育的强化学习&#xff1a;机遇与挑战 摘要 本综述文章源自作者在 Educational Data Mining (EDM) 2021 会议期间组织的 RL4ED 研讨会。我们组织了这一研讨会&#xff0c;作为一项社区建设工作的组…

idea的快捷键使用以及相关设置

文章目录 快捷键常用设置 快捷键 快捷键作用ctrlshift/注释选中内容Ctrl /注释一行/** Enter文档注释ALT SHIFT ↑, ALT SHIFT ↓上下移动当前代码Ctrl ALT L格式化代码Ctrl X删除所在行并复制该行Ctrl D复制当前行数据到下一行main/psvm快速生成入口程序soutSystem.o…

代码随想录算法训练营Day30

力扣452.用最少数量的箭引爆气球【medium】 力扣435.无重叠区间【medium】 力扣763.划分字母区间【medium】 力扣56.合并区间【medium】 一、力扣452.用最少数量的箭引爆气球【medium】 题目链接&#xff1a;力扣452.用最少数量的箭引爆气球 视频链接&#xff1a;代码随想录 题…

Swift —— delegate 设计模式

一、什么是 delegate 模式 所谓 delegate 就是代理模式。简单来说&#xff0c;delegate 模式就是在类的函数里运行完一段代码后&#xff0c;你可以通过一个符合某个代理协议的属性来调代理的方法。其中&#xff0c;代理方法就是回调函数。 二、delegate 模式与闭包比的优势 …

linux-vi和文件操作

在 Linux 系统的世界里&#xff0c;有一个核心思想贯穿始终&#xff0c;那就是 “万物都是文件”。这一理念极大地简化了系统资源的管理和操作&#xff0c;为用户和开发者提供了统一且高效的交互方式。本文将深入探讨这一理念在 Linux 文件系统中的具体体现&#xff0c;从硬盘分…

Endnote 21显示字段设置与修改详细解析(附Endnote Click)

目录 前言字段设置与详细解释Endnote Click1. 安装 Endnote Click2. 一键获取Edge插件3. 安装完成启动插件4. 检索期刊文献案例5. 在 Endnote Click 我的locker中导入文献 前言 在学术研究的漫漫征途中&#xff0c;高效管理参考文献是每位学者、学生都绕不开的关键环节。Endno…

java使用 ​Stream 流对自定义对象数组去重的

在 Java 中&#xff0c;使用 Stream 流对自定义对象数组去重的核心是确保对象能正确判断“重复”的逻辑。以下是具体实现方法及场景分析&#xff1a; 方法 1&#xff1a;直接使用 distinct()&#xff08;需重写 equals 和 hashCode&#xff09; 若自定义对象已正确重写 equals…

C++ (类的设计,对象的创建,this指针,构造函数)

类的设计 C对结构体是有增强的 可以包含函数作为结构体成员 可以直接定义变量 在结构体成员函数里面可以直接访问结构体成员变量 struct student{string name;int age;float score;void play_game(const string &name);}void student::play_game(const string game){}…

《ADVANCING MATHEMATICAL REASONING IN LAN- GUAGE MODELS》全文阅读

《ADVANCING MATHEMATICAL REASONING IN LAN- GUAGE MODELS: THE IMPACT OF PROBLEM-SOLVING DATA, DATA SYNTHESIS METHODS, AND TRAINING STAGES》全文阅读 提升语言模型中的数学推理能力&#xff1a;问题求解数据、数据合成方法及训练阶段的影响 \begin{abstract} 数学推…

网络测试工具:涵盖网络测速、密码查看、故障判断与网络监测

在网络管理与维护的广阔领域中&#xff0c;网络测试工具扮演着至关重要的角色。它们不仅简化了复杂的网络诊断流程&#xff0c;还提升了工作效率。今天推荐一款包含功能全面的网络测试工具&#xff1a;InetTest&#xff0c;是一款免费且开源的网络测试工具&#xff0c;适用于Wi…

小刚说C语言刷题——1005 - 已知一个圆的半径,求解该圆的面积和周长

1.题目描述 已知一个圆的半径&#xff0c;求解该圆的面积和周长。 输入 输入只有一行&#xff0c;只有 1个整数。 输出 输出只有两行&#xff0c;一行面积&#xff0c;一行周长。&#xff08;保留两位小数&#xff09;。 令 pi3.1415926。 样例 输入 1 输出 3.14 6.…

【算法】快速排序

算法系列六&#xff1a;快速排序 一、快速排序的递归探寻 1.思路 2.书写 3.搭建 3.1设计过掉不符情况&#xff08;在最底层时&#xff09; 3.2查验能实现基础结果&#xff08;在最底层往上点时&#xff09; 3.3跳转结果继续往上回搭 4.实质 二、快速排序里的基准排序 …

SoapUI 4.6.4(32位)下载安装教程 - 兼容老旧Windows系统

SoapUI 4.6.4&#xff08;32位版&#xff09; 是个老版本的测试工具&#xff0c;专门给 32位 Windows 电脑 用的。现在最新版都是 64 位的了&#xff0c;但如果你还在用老系统&#xff0c;可能还得找这个旧版。 SoapUI 4.6.4工具下载:https://pan.quark.cn/s/c07381db8102 这…

【AI量化第24篇】KhQuant 策略框架深度解析:让策略开发回归本质——基于miniQMT的量化交易回测系统开发实记

我是Mr.看海&#xff0c;我在尝试用信号处理的知识积累和思考方式做量化交易&#xff0c;应用深度学习和AI实现股票自动交易&#xff0c;目的是实现财务自由~ 目前我正在开发基于miniQMT的量化交易系统——看海量化交易系统。 本篇要讲到量化的核心了——策略。说白了每个投资者…

Java面试黄金宝典48

1. C++ 的拷贝构造函数,深拷贝和浅拷贝 定义 拷贝构造函数:在 C++ 里,拷贝构造函数属于特殊的构造函数,其功能是使用一个已存在的对象来初始化一个新对象。当对象以值传递的方式作为参数传给函数、函数返回对象、用一个对象初始化另一个对象时,拷贝构造函数会被调用。浅拷…

OpenCV学习之获取图像所有点的坐标位置(二)

1.功能介绍 (1)使用openCV解析了.jpeg、.jpg、.png格式的图像文件,输出了图像的宽、高、通道数; (2)创建txt格式文件,保存图像中各像素点的rgba值。 2.环境介绍 操作系统:window10 开发语言:visual studio 2015 c++ 3.功能实现过程 3.1环境设置 (1)打开Vs2015…

B2B2C多用户商城平台 的两种创新玩法

以前随便搞个淘宝京东那样的商城就能躺着赚钱的日子早过去了&#xff01;现在市面上各种电商玩法花样百出&#xff1a;小红书那种刷着刷着就下单的"种草"电商&#xff0c;拼多多那种"帮我砍一刀"的社交电商&#xff0c;还有抖音快手那种看着视频突然就想买…

【Bluedroid】A2DP Sink播放流程源码分析(二)

接上一篇继续分析&#xff1a;【Bluedroid】A2DP Sink播放流程源码分析(一)_安卓a2dp sink播放流程-CSDN博客 AVDTP接收端&#xff08;Sink&#xff09;流事件处理 bta_av_sink_data_cback 是 Bluedroid 中 A2DP Sink 角色的 AVDTP 数据回调函数&#xff0c;负责处理接收端的…

抗量子算法验证工具

抗量子算法计算工具 抗量子算法验证工具ML-KEMML-DSASLH-DSA 抗量子算法验证工具 2024年末&#xff0c;美国NIST陆续公布了FIPS-203、FIPS-204、FIPS-205算法标准文档&#xff0c;抽空学习了一下&#xff0c;做了个算法计算工具。 ML-KEM ML-DSA SLH-DSA 需要的朋友可留言交流…