C++实现深度遍历迷宫问题

本文介绍了使用深度遍历搜索迷宫路径的方法,重点在于理解深度遍历的思想,规定好寻找方向的顺序(右->下->左->上),并通过C++的栈实现递归遍历。在遍历过程中,对每个节点的状态和相邻节点的状态进行判断,避免重复搜索已访问节点,以找到有效路径或判断无路径。同时提供了节点和迷宫的代码结构,建议通过画图加深理解。
摘要由CSDN通过智能技术生成

题目要求

深度遍历搜索迷宫路径

	输入要求:
   		1、请输入迷宫的行列数(例如:10 10)
   		2、请输入迷宫的路径信息(0表示可以走,1表示不能走)
   		3、输入示例:
   			0 0 0 1 1
   			1 0 0 0 1
   			1 1 0 1 1
   			1 1 0 0 1
   			1 1 1 0 0

	输出要求:
    	1、如果没有路径,直接输出 : 不存在一条迷宫路径!
    	2、如果有路径,直接输出   :  将路径上的0改为*号然后输出!
    		* * * 1 1
    		1 0 * 0 1
    	    1 1 * 1 1
    	    1 1 * * 1
    		1 1 1 * *

深度遍历迷宫解题思路

  1. 首先大家需要了解深度遍历的思想、即在遍历过程中、总是在一个方向上一直找、直到不能在往下走、然后在切换方向、因此我们需要事先规定好寻找方向的顺序(此处给出的方向是 右->下->左->上),那么在遍历每个节点时、先判断当前节点的右方向是否能走、如果能走就直接进入当前节点的右边节点、否则才去判断当前节点的下边是否能走、以此类推,直到找到路径或者没有路径
  2. 因为是深度遍历、因此借助递归的思想、此处我们C++STL容器适配器的栈、帮助完成深度遍历
  3. 我们先将判断入口节点(左上角第一个节点)、如果入口节点是1、那就说明迷宫没有入口、直接返回并打印没有路径,否则就先将第一个节点入栈、然后取出栈顶元素(此时的栈顶元素就是第一个元素),按照上述方式判断当前节点的下一个节点是否位0,也就是能不能走,(注意此处判断的顺序),如果能走就将下一个节点入栈,如果不能走,就将当前节点出栈、最后栈中元素就是路径,当然前提是栈不为空,如果栈为空,就是没有找到路径
  4. 另外需要注意的一个点就是找过的节点就不再能在找、否则会出现环

注意:我们在这里需要对每个节点进行简单的封装,首先我们每个节点肯定必须有自己的横纵坐标,自己的状态(0或者1),还有一个重要的信息需要写入每个节点中,就是节点四个方向上的节点的状态(0或者1),这里单独将节点信息列出来

节点代码

const int DIR_SIZE = 4;

struct Node
	{
   
		int nx;    // 横坐标
		int ny;    // 纵坐标
		int nval;  // 状态值
		bool nstats[DIR_SIZE];  // 四个方向的状态值
	};

迷宫代码

#include <iostream>
#include <stack>     // STL容器适配器的stack
using namespace std;

//表示方向、注意四个值刚好对应节点中保存四个方向状态信息的下标
const int RIGHT = 0;
const int DOWN = 1;
const int LEFT = 2;
const int UP = 3;

// 表示存储方向数组的大小(四个方向)
const int DIR_SIZE = 4;

// 表示状态信息
const bool YES = true;  // 表示可以走
const bool NO = false;  // 表示不能走

// 迷宫类
class Maze
{
   
private:
	// 需要迷宫每个节点的类型、此处因此每个节点都有自己的x、y坐标、自己的状态(0,1)
	// 以及自己四个方向上的是否能走的、因此使用结构体来封装节点
	struct Node
	{
   
		int nx;    // 横坐标
		int ny;    // 纵坐标
		int nval;  // 状态值
		bool nstats[DIR_SIZE];  // 四个方向是否能走
	};

	Node** marr;           // 迷宫相当于是个二维表
	int mrow;              // 迷宫的行
	int mcol;              // 迷宫的列
	stack<Node> mstack;    // 深度遍历迷宫使用栈存储迷宫中最终找到的路径节点

public:
	Maze(int row, int col)
		: mrow(row)
		, mcol(col)
	{
   
	   // 动态开辟二维数组
		marr = new Node*[row];
		for (int i = 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值