BFS迷宫最小路径问题

给定一个迷宫,0表示空地可以走,1表示墙壁不能穿越;在迷宫中可以向(上下左右)四个方向行进;

找到从左上角到右下角的最短路径,并计算最短路径的长度。

迷宫示例如下:
在这里插入图片描述
算法步骤:

  • 1、从起始点出发,遍历四个方向,如果某个方向可以走,则先存储起来;
  • 2、按照四个方向中可以走网格进行尝试,如果该网格的四个方向仍可以走,则存储起来。
  • 3、直至到达网格的右下角,停止搜索。

从以上分析可以看出,该步骤是按照一个广度优先搜索的方式进行的,而广度优先搜索讲究的是先访问的亦先被访问。因此使用队列存储当前步骤下可以走的网格,并对可以走的网格进行上述的迭代。

由于我们需要求得左上角到右下角的最短路径,那么我们可以使用一个二维数组标记从哪个方向到达的当前网格(且可以通过该二维数组确认当前网格是否已经被访问,如果被访问过,则无需再次访问,因此第一次访问的就是最短的),最终通过从终点到起点的逆序搜索,即可得到最短的逆序路径。

使用栈存储该路径,最终栈的大小即为路径长度,出栈的序列即为最短路径序列;

void minPathBFS(vector<vector<int>> &maze) {
	//maze矩阵中,0表示可走,1表示墙不可走
	int rows = maze.size();
	int cols = maze[0].size();
	queue<pair<int, int>> poss;//存放当前可访问位置,先访问亦先被访问
	vector<vector<int>> visited(rows, vector<int>(cols));
	//记录从哪个方向到达当前该网格,默认-1为起点,0为没有走的默认值,1向上,2向下,3向左,4向右
	int jump[4][2] = { {-1,0},{1,0},{0,-1},{0,1} };//上下左右的跳跃方式
	pair<int, int> start(0, 0);
	poss.push(start);
	visited[0][0] = -1;
	while (!poss.empty()){
		int x = poss.front().first;
		int y = poss.front().second;
		poss.pop();
		if (x == rows - 1 && y == cols - 1){
			break;
		}
		//遍历四个方向,如果有可以走的,先将可走的位置放在队列中,如果到达了终点,则直接break
		for (int i = 0; i < 4; i++){
			int newX = x + jump[i][0];
			int newY = y + jump[i][1];
			//矩阵边界范围内,不是墙,且未被访问过
			if (newX >= 0 && newX < rows && newY >= 0 && newY < cols && maze[newX][newY] == 0 && visited[newX][newY] == 0){
				poss.push(pair<int, int>{newX, newY});
				visited[newX][newY] = i + 1;//标记从哪个方向过来
			}
		}
	}
	//根据历史路径矩阵画出原始路径
	int stX = rows-1, stY = cols-1;
	if (visited[stX][stY] == 0){
		cout << "不存在从左上角到右下角的路线" << endl;
		//return;
	}
	//由于从终点到起点是逆序的,因此需要使用栈进行存储
	stack<pair<int, int>> path;
	path.push(pair<int, int>{stX, stY});
	//存在这条路径的话,一定可以从右下角走到左上角
	while (stX!=0 || stY!=0){
		int aX = stX - jump[visited[stX][stY]-1][0];
		int aY = stY - jump[visited[stX][stY]-1][1];
		path.push(pair<int, int>{aX, aY});
		stX = aX; stY = aY;//更新当前位置
	}
	int pathLens = path.size();
	cout << "最短路径长度为:" << pathLens << endl;
	while (!path.empty()){
		cout <<"[" <<path.top().first << "," << path.top().second <<"]"<< endl;
		path.pop();
	}
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

云计算之网络

目录 一、VPC&#xff1a;云网络的基石 1.1 VPC产品介绍 1.2 vswitch交换机 1.3 vrouter路由器 1.4 产品架构 1.5 常见问题解答及处理 1.5.1 VPC内如何查询某个IP归属? 1.5.2 网络ACL阻断导致ECS访问CLB不通 1.5.3 EIP秒级突发/分布式限速丢包 1.5.4 NAT网关的流量监…

解决“msvcr120.dll”缺失的问题:全面指南,快速修复msvcr120.dll错误

在使用多种软件或游戏时&#xff0c;Windows 用户经常会遇到“msvcr120.dll文件缺失”或“文件损坏”的错误提示。这个问题可能会阻碍应用程序的启动和运行&#xff0c;给用户带来诸多不便。本文将深入探讨msvcr120.dll文件的功能、它为何频繁出现问题&#xff0c;以及用户应如…

18、Gemini-Pentest-v1

难度 中 &#xff08;个人认为是高&#xff09; 目标 root权限 一个flag 靶机启动环境为VMware kali 192.168.152.56 靶机 192.168.152.64 信息收集 突破点大概就是web端了 web测试 访问主页直接就是目录遍历 不过进去后是一个正常的网页 简单的试了几个弱口令无果继续信息…

第七届“泰迪杯”数据分析技能赛 赛前指导安排

竞赛时间安排 报名起始时间&#xff1a; 2024年9月3日-11月7日 赛前指导时间&#xff1a; 2024年9月10日-11月7日 A 题竞赛时间&#xff1a; 2024年11月9日 8:00-20:00 &#xff08;* 8:00:00开放赛题及数据&#xff09; B 题竞赛时间&#xff1a; 2024年11月10日…

【免费分享】25秋招提前批25秋招信息表

秋招&#xff0c;即秋季校园招聘&#xff0c;通常是指每年秋季&#xff08;大约从9月到11月&#xff09;企业在各大高校举办的招聘活动。这是许多公司为了吸引优秀应届毕业生而进行的招聘活动&#xff0c;也是许多学生毕业后进入职场的重要途径。以下是秋招的一些关键点&#x…

将esp32-s3-eye做为USB网络摄像头(UVC设备)

官方网址&#xff1a;usb_webcam 支持UVC同步、批量传输模型只支持MJPEG传输格式支持板上LCD动画esp32-s3-eye&#xff08;IDF v5.0或更高版本&#xff09; 硬件要求 官方默认的USB WebCam config就是乐鑫带摄像头OV2604的esp32-s3-eye&#xff0c;其他的开发板可以参考官方网…

多环境jdk安装,CentOS,统信UOS,Ubuntu,KylinOS,windows

文章目录 1.CentOS1.1yum安装1.2压缩包安装 本文档只是为了留档方便以后工作运维&#xff0c;或者给同事分享文档内容比较简陋命令也不是特别全&#xff0c;不适合小白观看&#xff0c;如有不懂可以私信&#xff0c;上班期间都是在得 1.CentOS 1.1yum安装 yum install -y jav…

Linux 安装神州通用数据库 ShenTong7.0.8_342.92_linux64

Linux 安装神州通用数据库 ShenTong7.0.8_342.92_linux64 1、准备工作2、安装数据库3、启停数据库4、后续步骤 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Linux环境下安装神州通用数据库&#xff08;ShenTong&#xff09;是一个相对直…

家庭用超声波清洗机哪个品牌好用?好用的眼镜清洗机推荐

在我们的日常生活中&#xff0c;像眼镜、项链和耳环这些频繁使用的个人物品&#xff0c;经常面临灰尘积聚和细缝中难以触及的污渍问题。超声波清洗机凭借其深入微细缝隙的清洁能力&#xff0c;成为了解决这一难题的理想工具&#xff0c;确保了这些珍贵小物的彻底清新。不过现在…

云手机能否全面替代传统手机?深入探讨云手机的优缺点

随着云计算技术的飞速发展&#xff0c;云手机作为一种新型的手机形态&#xff0c;已经逐渐进入人们的视野。越来越多的人开始使用云手机来运行各类应用&#xff0c;尤其是在群控、海外业务等场景中&#xff0c;云手机展现出明显的便利性和优势。那么&#xff0c;云手机究竟有什…

【困难】 猿人学web第一届 第18题 jsvmp 洞察先机

文章目录 数据接口分析还原加密参数插桩调试分析日志插桩补充 python 代码 数据接口分析 数据接口 https://match.yuanrenxue.cn/match/18data 请求参数 {page: 页码, t: 时间戳, v: 加密值} 请求第一页不需要携带 t, v 参数 cookie 只需要携带 sessionid 只要 还原加密字段…

《PneumoLLM:利用大型语言模型的力量进行尘肺病诊断》|文献速递--基于深度学习的医学影像病灶分割

Title 题目 PneumoLLM: Harnessing the power of large language model for pneumoconiosis diagnosis 《PneumoLLM&#xff1a;利用大型语言模型的力量进行尘肺病诊断》 01 文献速递介绍 在计算机辅助诊断领域&#xff0c;对医学数据的处理和分析能力至关重要。这不仅有助…

在Application中全局获取context

首先自定义一个application&#xff0c;继承Application&#xff0c;并在AndroidManifest.xml文件中配置它。 class TvApplication : Application() {companion object {Volatilevar context: Application? nullprivate setfun getContext(): Context {return context ?: t…

【机器学习】从零开始理解深度学习——揭开神经网络的神秘面纱

1. 引言 随着技术的飞速发展,人工智能(AI)已从学术研究的实验室走向现实应用的舞台,成为推动现代社会变革的核心动力之一。而在这一进程中,深度学习(Deep Learning)因其在大规模数据处理和复杂问题求解中的卓越表现,迅速崛起为人工智能的最前沿技术。深度学习的核心是…

2024年最佳本地营销策略的14个专家意见

本地营销对任何企业都很重要——无论您是市中心的夫妻店&#xff0c;还是大型全国连锁店。您都希望被寻找您产品或服务的人看到并找到&#xff0c;而他们通常是在本地搜索这些内容。事实上&#xff0c;几乎一半的Google搜索都有本地意图。 那么&#xff0c;今年哪些是最好的本…

金智维K-RPA基本介绍

一、K-RPA基本组成 K-RPA软件机器人管理系统基于“RPAX”数字化技术打造&#xff0c;其核心系统由管理中心(Server)、设计器(Control)、机器人(Robot/Agent)三大子系统组成&#xff0c;各子系统协同工作&#xff0c;易于构建协同式环境。 管理中心&#xff08;Server&#xff…

echarts 5.3.2 折线图 tooltip设置trigger为axis无效

在使用echarts5.3.2过程中&#xff0c;发生一个不应该发生的bug&#xff0c;希望效果如下 现实中如下 代码中设置了tooltip: {trigger: ‘axis’}不生效啊。查阅文档&#xff0c;应该是这样设置的啊&#xff0c;可是为什么无效呢。改成tooltip: {trigger: ‘item’}虽能显示弹…

09-03 周二 ansible部署与使用指南

09-03 周二 ansible部署与使用指南 时间版本修改人描述2024年9月3日10:08:58V0.1宋全恒新建文档&#xff0c;2024年9月4日13:57:25v0.2宋全恒调整结构&#xff0c;添加ansible-playbook和ansible-inventory 简介 首先要找一个跳板机&#xff0c;来确保所有的机器都可以访问。然…

C#自定义控件的放置与拖动

1、自定义控件 using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Drawing.Drawing2D; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace PartA…

动态内存管理【存稿】

动态内存管理 1.为什么有动态内存分配&#xff1f; 我们所知道的内存开辟 int a 3; //在栈空间上开辟4个字节 char b a; //在栈空间上开辟1个字节 int arr[30] {0};//在栈空间上开辟120个字节的连续空间这种内存开辟的特点&#xff1a; 空间开辟的大小是固定的 数组在申…