迷宫问题深度遍历搜索

前言

	简单问题,写的不好,大佬见谅.
	如有疏漏,恳请指正,小编垂首.

问题描述:

有一个迷宫地图,有一些可达的位置,也有一些不可达的位置(障碍、墙壁、边界)。从一个位置到下一个位置只能通过向上(或者向右、或者向下、或者向左)走一步来实现,从起点出发,如何找到一条到达终点的通路。
  用二维矩阵来模拟迷宫地图,1代表该位置不可达,0代表该位置可达。每走过一个位置就将地图的对应位置标记,以免重复。找到通路后打印每一步的坐标,最终到达终点位置。

问题解析:

深度遍历搜索

实现代码:

代码如下(示例):

#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 = 0; i < row; ++i)
		{
   
			marr[i] = new Node[col];
		}
	}
	~Maze()
	{
   
		for (int i = 0; i < mrow; ++i)
		{
   
			delete[]marr[i];
		}
		delete[]marr;

		marr = nullptr;
	}

	// 初始化每个节点的状态信息、并将节点四个方向上都先设置为不能走、
	void init_maze(int x, int y, int val)
	{
   
		marr[x][y].nx = x;
		marr[x][y].ny = y;
		marr[x][y].nval = val;
		for (int i = 0; i < DIR_SIZE; ++i)
		{
   
			marr[x][y].nstats[i] = NO;
		}
	}

	// 在初始化完成以后每个节点都知道自己四个方向是否能走、并将其设置到节点的方向数组中
	void set_dir_stats()
	{
   
		for (int i = 0; i < mrow; ++i)
		{
   
			for (int j = 0; j < mcol; ++j)
			{
   
				// j < mcol -1 防止最右边一列元素访问越界
				if (j < mcol - 1 && marr[i][j + 1].nval == 0)
				{
   
					marr[i][j].nstats[RIGHT] = YES;
				}
				// i < mrow -1 防止最下边一行元素访问越界
				if (i < mrow - 1 && marr[i + 1][j].nval == 0)
				{
   
					marr[i][j].nstats[DOWN] = YES;
				}
				// j > 0 防止最左边一列元素访问越界
				if (j > 0 && marr[i][j - 1].nval == 0)
				{
   
					marr[i][j].nstats[LEFT] = YES;
				}
				// i > 0 防止最上边一行元素访问越界
				if (i > 0 && marr[i - 1][j].nval == 0)
				{
   
					marr[i][j]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

twfplayer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值