C++迷宫问题 深度优先算法

C++ DFS实战:用深度优先搜索解决迷宫问题(附完整代码) 本文通过C++深度优先搜索(DFS)算法实战迷宫寻路问题,详细解析了DFS的递归实现与回溯机制。文章提供了完整的代码示例,从数据结构设计到可视化调试,并探讨了性能优化与工程化应用,帮助开发者掌握这一核心算法思想,提升解决实际问题的能力。 阅读详情

迷宫问题


问题:用一个二维数组来存储迷宫,数组中的每个元素的值只取0或1,其中0表示此路可通,1表示此路不通。对于上例的迷宫可存储如图。
在这里插入图片描述
假定迷宫入口坐标为(1,1)
输出为路径
实现代码如下

/*
   迷宫问题
   作者:Lumao
   版本:2021/3/28 0.0版
   方法:C++ 队列 数组 结构体 递归 深度优先
   目标:找到地图中的所有走法并输出
   要点:记录路径 恢复现场 深搜
   小结:拎出一个位置来分析,往哪走,出去了做什么,要回来怎么做
*/
#include<iostream>
#include<stack>
#include<queue>
using namespace std;
#define m  6//地图长
#define n  8//地图宽
int Count = 0;//记录不同走法数量
struct step//坐标类型
{
	int x;
	int y;
	bool operator!=(step&q) //用于后面退回时的函数back_one_step
	{
		return (x != q.x || y != q.y) ? true : false;
	}
};
struct step Move[8] {//step 类型数组Move代表8个前进方向
	{0,1},
	{1,1},
	{1,0},
	{1,-1},
	{0,-1},
	{-1,-1},
	{-1,0},
	{-1,1}
};
int TheMap[][n+2] = {//初始地图,1表示此路不通,0表示可以通过,外面加一层1为围墙
	{1,1,1,1,1,1,1,1,1,1},
	{1,0,1,1,1,0,1,1,1,1 },
	{1,1,0,1,0,1,0,1,0,1 },
	{1,0,1,0,0,1,1,1,1,1 },
	{1,0,1,1,1,0,0,1,1,1 },
	{1,1,0,0,1,1,0,0,0,1},
	{1,0,1,1,0,0,1,1,0,1 },
	{1,1,1,1,1,1,1,1,1,1}
};

queue<step>s;//用于记录路径的队列
int Maze[m + 2][n + 2];//当前地图

void initialize(int Maze[m+2][n+2])//初始化地图
{
	for (int i = 0; i < m + 2; i++)
		for (int j = 0; j < n + 2; j++)
			Maze[i][j] = TheMap[i][j];
	while (!s.empty())
		s.pop();//清空记录的路径
}
void Restore(int Maze[m + 2][n + 2],int x,int y,int loop)//恢复地图
{
	int loop_now=loop;//只要把当前loop及loop之前方向数据恢复即可
	int j, k;
	for (; loop_now >= 0; loop_now--)
	{
		j = x + Move[loop_now].x;
		k = y + Move[loop_now].y;
		Maze[j][k] = TheMap[j][k];
	}
}
void back_one_step(step last)//从记录路径的队列中去掉最近一次记录的那一步
{
	while (s.front() != last)
	{
		s.push(s.front());
		s.pop();
	}
	s.pop();//去掉last坐标
}
void PrintPath()//打印路径
{
	step path;
	queue<step>temp;
	cout << "Path No."<<++Count<<" :" << endl;
	while (!s.empty())
	{
		path = s.front();
		temp.push(path);
		cout << "(" << path.x << "," << path.y << ")" << endl;
		s.pop();
	}//将队列中的路径输出并pop

	while (!temp.empty())//恢复队列中存储的路径,因为要继续探索其他路径
	{
		path = temp.front();
		s.push(path);
		temp.pop();
	}
}
int MazePath(int x, int y)//走迷宫函数
{
	step temp;
	int j, k;
	int loop;//循环8个方向
	Maze[x][y] = -1;//标志位置已经到达过
	for (loop = 0; loop < 8; loop++)//探索当前位置的八个相邻位置
	{
		j = x + Move[loop].x;//采用move作为数组名与保留字冲突了,改为Move
		k = y + Move[loop].y;
		if ((j == m)&&(k == n))//找到出口
		{
			step out = { m,n };//记录出口到路径中
			s.push(out);
			PrintPath();//输出路径
			cout << endl;
			Restore(Maze,x,y,loop);//恢复迷宫

			//退一步
			back_one_step(out);

			//return 1;//表示成功找到路径
			continue;//继续循环
		}
		if (Maze[j][k] == 0)//新位置是否可到达
		{
			temp.x = j;
			temp.y = k;
			s.push(temp);//保存该点坐标
			MazePath(j, k);//深度优先算法,从当前点重新开始出发

			//如果要找出所有出路,则需要一个恢复现场的标记
			//结束MazePath(j,k)内的循环遍历后,恢复进入前的环境
			//在递归中去除Maze(j,k)的-1标记即可。
			Maze[j][k] = 0;
			back_one_step(temp);//从路径队列中去掉刚刚记录的那一步
		}
	}
	return 0;
}

int main()
{
	initialize(Maze);//初始化地图
	MazePath(1, 1);//以(1,1)为入口,若没有输出则说明该地图没有路径
	system("pause");
	return 0;
}

若认为该代码可以有可以更优化的地方,望不吝指教

【C++算法】dfs深度优先搜索(上) ——【全面深度剖析+经典例题展示】 【C++算法1】dfs深度优先搜索(上) ——【全面深度剖析+经典例题展示】 阅读详情

相关推荐

[C++] DFS-迷宫问题全部路径

文章目录

szdytom的博客 3320

C++求迷宫的路径数目(深度优先遍历)

题目背景 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过。给定起点坐标和终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案。在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。(1<=M,N<=5) 输入格式 第一行N、M和T,N为行,M为列,T为障碍总数。第二行起点坐标SX,SY,终点坐标FX, FY。接下来T行,每行为障碍点的坐标。 输出格式 给定起点坐标和终点坐标,问每个方格最多经过1次,从起点坐标到终点坐标的方案总数。 输入输出

qq_51053940的博客 1332

C++迷宫问题

C++迷宫问题

Christopherwa的博客 4944

C++迷宫问题求解(用队列实现)

19、迷宫问题求解(用队列实现)【任务】以一个m*n的长方阵表示迷宫。0和1分别表示迷宫中的通路和障碍。解迷宫通常用的是“穷举求解”方法,即从入口出发、顺着某个方向进行探索、若能走通,则继续往前进;否则沿着原路退回,换一个方向继续探索,直至出口位置,求得一条通路。假如所有可能的通路都探索到而未能到达出口,则所设的迷宫没有通路。【数据结构】可以二维数组存储迷宫数据,为处理方便起见可在迷宫的四周加一圈障碍。对于迷宫中任一位置、均可约定有东、南、西、北四个方向可通。

程序设计 2198

C++迷宫问题深度优先搜索(DFS)与回溯算法详解及实现

深度优先搜索(DFS)是一种用于遍历或搜索树或图数据结构的经典算法。其核心原理是沿着某条分支尽可能深地探索,直到到达末端或满足特定条件,然后回溯到上一个分叉点,尝试其他未探索的分支。这种系统性的探索方式在解决状态空间搜索问题时具有重要技术价值,尤其适用于路径存在性判断、全排列生成和约束满足问题求解等场景。在工程实践中,DFS常与回溯算法结合,通过“标记-探索-撤销”的循环来高效探索所有可能解,避免重复访问。本文以C++实现迷宫路径搜索为例,深入剖析了DFS递归实现、路径记录、边界处理及性能优化等关键环节,为

weixin_32308101的博客 180

C++ DFS实战:从迷宫问题到背包问题,5个经典案例带你彻底掌握深度优先搜索

本文通过迷宫寻路、连通区域计数、数的拆分、0-1背包和体积组合这5个经典案例,系统讲解如何运用C++实现深度优先搜索算法。内容涵盖DFS的核心思想、递归框架、剪枝优化、记忆化搜索及实战技巧,帮助读者从理解概念到彻底掌握DFS在算法竞赛和面试中的实际应用。

weixin_29309213的博客 518

DFS 深度优先搜索C++实现(迷宫问题)

DFS(Depth First Search)深度优先搜索C++实现(迷宫问题) 实现代码 #include<bits/stdc++.h> using namespace std; const int MAXSIZE = 100; int maze[MAXSIZE][MAXSIZE]; vector< pair<int, int> > path;//动态数组p...

qq_44486439的博客 2453

C++走迷宫问题(深度优先遍历 + 广度优先遍历)

迷宫是许多小方格构成的矩形,在每个小方格中有的是墙(用1表示),有的是路(用0表示)。走迷宫就是从一个小方格沿上、下、左、右四个方向到邻近的方格,当然不能穿墙。设迷宫的入口是在左上角(1,1),出口是在右下角(8,8)。根据给定的迷宫,找出一条从入口到出口的路径。

guo97的博客 3504

用c++下dfs深度优先解决迷宫问题

【代码】用c++下dfs深度优先解决迷宫问题。

qq_59143106的博客 600

C++解决走迷宫问题:DFS、BFS算法应用

DFS 的优点:适合用于深度较深或复杂的解空间,空间复杂度较低(相较于 BFS),实现简单,能够遍历所有可能的解。时间复杂度:通常是 O(n + m),其中 n 是节点数,m 是边数,适用于图和树结构。空间复杂度:O(h + n),其中 h 是最大深度,n 是节点数。对于递归实现,栈深度与树的深度或图的深度相关。DFS 更加适合处理需要深度优先探索的任务,特别是当你不关心最短路径时,DFS 能够迅速深入到可能的解空间深处。

琅嬛福地 1706

从“Hello World”到区域赛银牌:我的ACM算法打怪升级全记录(附各阶段工具包)

本文记录了作者从编程新手到ACM区域赛银牌获得者的完整学习历程,详细分享了各阶段的算法学习路线、刷题策略和实战经验。涵盖从基础算法到动态规划的系统训练方法,并附赠经过竞赛检验的工具包和资源清单,为算法竞赛爱好者提供实用参考。

weixin_29201859的博客 122

c++算法之迷宫问题 和 DFS

其实就是电脑爬墙走。例如:现在在[x,y]点,我要判断[x+1,y],[x-1,y],[x,y+1],[x,y-1]点,是不是有障碍物或走过的路一样。在看到nx和ny,就会发现:这不就是[x+1,y],[x-1,y],[x,y+1],[x,y-1]的坐标吗?在c++里,我们一般用二维数组来存储,例如n*n大小的地图就是m[n][n],地图中存在空地或障碍物,就可以使用 0表示空地,1表示障碍物。如果细来讲,我们可以把迷宫化为一个平面矩阵,通过行、列来确定位置,对应位置不同的内容表示不同的地图信息。

lingllllove的博客 875

APB Timer验证环境搭建——学习笔记(6)

(1)为RELOAD VALUE配置初始值32'h8000_0000,设定边界值32'h4000_0000,可以看到减到想要的边界值的时候,counter重新加载RELOAD VALUE,重新开始计数;这根线,统计等待到中断的次数,与理论值做。(2)设定Reload value。(1)由于counter。recount总共次数;

qq_41651535的博客 497

深度优先探索算法 C++ 迷宫问题

深度优先探索的模板如下: void dfs(int step){ 判断边界 尝试每一种可能 for(int i=0;i<n;i++){ 继续下一步 dfs(step+1); } 返回; } 以最经典的迷宫问题试试水,题目:↓↓↓ 描述 定义一个二维数组N*M(其中2<=N<=10;2<=M<=10),如5 × 5数组下所示: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1,

qq_36410357的博客 560

mongoDB 数据莫名其妙的没了

问题 之前没有接触过mongoDB,然后接手一个项目使用的是MongoDB,我就跟着网上的教程搭建一个MongoDB的服务,并运行起来。 一开始没有啥问题,成功的把服务与MongoDB都启动以来,运行也没有问题。但是过了几天,我再次打开时发现,以前的数据神奇的消失了。我还在想,是有什么定时清除的么,还是什么原因导致崩了然后数据就被清理了。 查找原因 第一次遇到我没有在意,重启了一下MongoDB,...

技术熊的博客小窝 1万+

STM32_WS2811驱动

STM32的WS2811驱动

健身房 2839

迷宫问题(DFS)详细解法C++版

在一个有迷宫里,有些路是可以通行的,有些路是不能通行的。我们判断位于(0,0)点的机器猫能否走到(n-1,m-)位置,可以理解成能否从左上角走到右下角。

2401_87272213的博客 612

YOLOv10改进,YOLOv10二次创新C2f结构采用WTConv卷积(感受野的小波卷积),ECCV 2024

WTConv 的核心思想是通过结合卷积神经网络(CNN)的强大特征提取能力与小波变换的多尺度特性,来实现大感受野的卷积操作,同时避免传统大卷积核带来的参数爆炸问题。传统的卷积操作通过滑动小窗口在图像上逐步执行局部特征提取,感受野的大小直接取决于卷积核的尺寸。随着卷积核的增大,参数量呈指数增长,导致网络训练效率降低、计算资源消耗增加。为解决这些问题,WTConv 提出了在小波域中执行卷积操作的策略。小波变换是一种常用于信号处理的技术,能够将信号分解为不同频率成分。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1022

c++使用深度优先算法和广度优先算法解决迷宫问题

求从迷宫左上角(0,0)到右下角(M-1,N-1)的路径。M x N的迷宫如下:O代表可通行,X代表不可通行。每次只能往上下左右四个方向走一步。

wyhelloworld的博客 1173

优秀的 Verilog/FPGA开源项目介绍(二十七)- 小型CPU

介绍在FPGA上实现一个CPU是一个令人兴奋的事情,但是太复杂的CPU实现起来太难,而且不适合去了解计算机的架构,所以今天介绍一些小型的CPU,比如8051、MIPS、MSP430等~关于RISC-V的项目,请查看《优秀的 Verilog/FPGA开源项目介绍(二)-RISC-V》ZipCPUhttp://zipcpu.com/about/zipcpu.html项目介绍Z...

OpenFPGA的博客 2574

保姆级教程:如何将仅限客户端使用的免费大模型(Gemini、Antigravity、Qwen Code、Kiro 等)转为任何应用可调用的 OpenAI 兼容标准接口

大模型 API 费用太贵?💸 这篇文章分享一个薅羊毛神器,能把 Gemini、Qwen Code、Kiro 等客户端专属的免费大模型转换成标准 OpenAI 兼容接口 🔌。支持多协议互转、账户池管理、Web 管理界面,Docker 一键部署,零成本调用 Claude Opus 4.5、Gemini 3 Pro 等高级模型 ✅

XiaoqiangClub的博客 1033

用DFS算法解决迷宫问题(附C++代码示例)

还记得自动走迷宫的屏保吗?

2202_76049826的博客 977

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【算法】C++深度优先搜索(DFS)全解析

本篇博文对深度优先搜索(DFS)做了一个较为详细的介绍,不知道对你有没有帮助呢觉得博主写得还不错的三连支持下吧!会继续努力的~

2301_77954967的博客 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

《解密迷宫与组合问题:DFS算法的C++实战指南》

DFS是一种用于遍历或搜索树或图的算法。它沿着树的深度遍历树的节点,尽可能深地搜索树的分支。当节点v的所在边都已被探寻过,搜索将回溯到发现节点v的那条边的起始节点。DFS是一种强大而灵活的算法,通过本文的讲解和代码示例,我们可以看到它在树、图遍历以及组合问题等方面的广泛应用。掌握DFS的关键在于理解其递归本质和回溯机制,并能够根据具体问题选择合适的实现方式和优化策略。在实际应用中,DFS常常需要与其他算法技巧结合使用,如剪枝、记忆化等,以提高算法效率。

2501_91516851的博客 704

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

DFS求迷宫问题。

因为前两天的蓝桥杯发现了这个知识盲区,且很多问题这个方法也是很有用的,所以花了几天时间学了这个算法。 刚开始也是慢慢从八皇后问题到马走日遍历问题慢慢学的。最后我的经验是,BFS统一有一个通式,即再递归之后将之前标记的元素还原,在正式解决题目之前,先分享一下最近了解的几个新知识吧。 首先C++的万能头文件。写了这个就不用再天天为敲头文件而烦恼了。 ![万能头文件#include<bits/...

CHEN_8796的博客 633
上一篇: C++POJ2503BabelFish
下一篇: C++迷宫问题(广度优先算法)
Laborious_Bee
博客等级 码龄7年 1粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值