BFS迷宫最小路径问题

news2024/11/24 9:32:35

给定一个迷宫,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();
	}
}

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

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

相关文章

org.aspectj.apache.bcel.classfile.ClassFormatException 深度解析

org.aspectj.apache.bcel.classfile.ClassFormatException 深度解析 ### 概述 在前端开发和Java后端交互的复杂环境中&#xff0c;org.aspectj.apache.bcel.classfile.ClassFormatException 作为一个难以预测的异常&#xff0c;时常给开发者带来困扰。这个异常主要与 AspectJ—…

Trigger源码分析 -- ant-design-vue系列

Trigger源码分析 – ant-design-vue系列 1 概述 源码地址&#xff1a; https://github.com/vueComponent/ant-design-vue/blob/main/components/vc-trigger/Trigger.tsx 在源码的实现中&#xff0c;Trigger组件主要有两个作用&#xff1a; 使用Portal组件&#xff0c;把Pop…

迟滞比较器/施密特触发器

功能 从下面原理图像看来&#xff0c;只有在达到上下阈值才会出现输出电平的转换&#xff0c;这样防止信号的杂波跳变。而且每次的阈值是随着输出而变化的&#xff0c;当输出高时&#xff0c;阈值如下图中&#xff0c;V_PV_N V_R*( RF/(R1RF) )VH*( R1/(R1RF) );当输出低时&a…

QT核心机制

目录 学习内容&#xff1a; 1. 对话框 1.1 消息对话框&#xff08;QMessageBox&#xff09; 1.2 消息对话框实例 1.3 颜色对话框&#xff08;QColorDialog&#xff09;、字体对话框&#xff08;QFontDialog&#xff09;、文件对话框&#xff08;QFileDialog&#xff09; …

Python面试常见问题及详细解答:从基础到高级概念全覆盖

创作不易&#xff0c;您的打赏、关注、点赞、收藏和转发是我坚持下去的动力&#xff01; 以下是Python面试中常见的一些问题及其详细答案的整理&#xff1a; 1. Python的可变与不可变对象 问题: 什么是可变对象和不可变对象&#xff1f;举例说明。答案: 可变对象: 可以在原地…

实现卷积层的前向传播(Pythom版)

在TensorFlow框架中&#xff0c;实现卷积层&#xff08;2维&#xff09;的代码是 tf.keras.layers.Conv2D()。它主要接收如下几个参数&#xff0c; filters&#xff1a;卷积核的个数&#xff0c;也就是卷积层输出的通道数&#xff08;沿axis-1的维度&#xff09; kernel_size&a…

AI秒画损失函数曲线图(Loss Function Curve)

在深度学习模型训练中&#xff0c;Loss曲线图是衡量模型性能的一个重要指标。通过绘制Loss曲线&#xff0c;能够清楚地观察到模型在训练过程中的收敛情况&#xff0c;从而帮助我们判断模型是否出现过拟合或欠拟合。本文将介绍如何通过简单几步&#xff0c;快速绘制出训练的Loss…

iphone16-iphone16pro原壁纸分享

iphone16-iphone16pro原壁纸分享 苹果公司在2024年9月10日的秋季新品发布会上正式推出了iPhone 16系列智能手机。以下是iPhone 16系列的主要特点和更新&#xff1a; 全新A18芯片&#xff1a;iPhone 16系列搭载了苹果最新的A18芯片&#xff0c;这款芯片专为苹果智能&#xff08;…

【WebGIS实例】(16)GeoServer 自定义样式 - 渲染矢量数据

1. 前言 本篇博客将会分享一系列的 GeoServer 样式&#xff0c;通过这些样式预先在服务端完成数据渲染&#xff0c;让前端应用更便捷的加载数据服务。 2. 面矢量 示例数据&#xff1a; {type: FeatureCollection,features: [{type: Feature,properties: {分类字段: 字段一…

PPT复制图表时颜色发生变化怎么办?

有时可能想复制其他PPT的图表到另一个PPT里&#xff0c;复制过来发现颜色发生了变化&#xff0c;这与我们PPT中的主题色颜色不同有关&#xff0c;所以就导致了图表的变色。 以上两张图片就是发生了变色的情况&#xff0c;一个是原来的颜色&#xff0c;一个是变化后的颜色。 解…

【鸿蒙】HarmonyOS NEXT星河入门到实战4-ArkTS界面布局深入

目录 一、布局元素组成 1.1 内边距-padding 1.2 外边距 margin 1.3 实战案例-QQ音乐-登录 1.4 边框 border 二、设置组件圆角 2.1 基本圆角设置 2.2 特殊形状的圆角设置 三、背景属性 3.1 背景图片-backgroundImage 3.2 背景图片位置-backgroundImagePosition 3.3 背…

什么是梯度? 梯度的作用 梯度的应用场景。

梯度 是一个非常重要的概念,它直接关系到模型的训练过程。以下是对梯度的详细解释: 梯度的基本概念 梯度 是一个向量,表示函数在某一点的导数或偏导数。在多维空间中,梯度指向的是函数值上升最快的方向。对于一个函数 f(x),在某一点 x 处的梯度记作 ∇f(x),它可以理解为在…

【Linux进程详解】进程地址空间

目录 1.直接写代码看现象 2.引入最基本的理解 3.细节问题-理解它 1.直接写代码看现象 #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <unistd.h> int g_val 100;int main() {printf("fath…

常回家看看之house of kiwi

house of kiwi 前言&#xff1a;house_of_kiwi 一般是通过触发__malloc_assert来刷新IO流&#xff0c;最后可以劫持程序流或者通过和setcontext来打配合来进行栈迁移来得到flag。 我们看看触发的源码 #if IS_IN (libc) #ifndef NDEBUG # define __assert_fail(assertion, fi…

MFC之CString类及其成员函数用法详解

CString是 CStringT(属于MFC 和 ATL 之间共享的类) 的类模板的专用化&#xff0c;没有基类。在头文件atlstr.h中可以看到CString的定义&#xff1a; CString对象由可变长度的一队字符组成。CString是基于TCHAR数据类型的对象。如果在你的程序中定义了符号_UNICODE&#xff0c;则…

Leetcode 300. 最长递增子序列 记忆化搜索、贪心二分 C++实现

Leetcode 300. 最长递增子序列 问题&#xff1a;给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,2,7] 是…

猫头虎推荐:2024国内好用的PyPIP换源库

猫头虎推荐&#xff1a;2024国内好用的PyPIP换源库&#x1f525;&#x1f680; 在国内使用 Python 时&#xff0c;由于访问官方的 PyPI 速度较慢甚至无法连接&#xff0c;选择一个可靠的国内 PyPI 镜像源至关重要&#x1f4c8;。为了更高效地完成项目开发&#xff0c;今天猫头…

BC172 牛牛的排列数(c 语言)

1.我们先输入n m的数字&#xff0c;因为n!/(n-m)!的阶乘。即4&#xff01;4*3*2*1&#xff0c;2&#xff01;2*1&#xff0c;4&#xff01;/2&#xff01;12.或者4&#xff01;4*3*2&#xff01;。 #include<sdtio.h> int main() {int n 0;int m 0;long long a 1;whi…

Leetcode面试经典150题-55.跳跃游戏

解法都在代码里&#xff0c;不懂就留言或者私信 class Solution {public boolean canJump(int[] nums) {/**如果就一个位置&#xff0c;你本来就在这&#xff0c;肯定可以跳到*/if(nums.length 1) {return true;}/**这个题的解题思路是遍历数组&#xff0c;如果当前位置不在之…

Linux网络——从《计算机网络》到网络编程

文章目录 从《计算机网络》到网络编程从计算机到计算机网络解决问题网络与计算机系统计算机网络的传输流程IP地址与MAC地址 从《计算机网络》到网络编程 科班的同学大多学过计算机网络&#xff0c;而非科班的同学也多多少少听说过一些 计算机网络体系十分繁杂且精妙&#xff…