题目要求
深度遍历搜索迷宫路径
输入要求:
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 * *
深度遍历迷宫解题思路
- 首先大家需要了解深度遍历的思想、即在遍历过程中、总是在一个方向上一直找、直到不能在往下走、然后在切换方向、因此我们需要事先规定好寻找方向的顺序(此处给出的方向是 右->下->左->上),那么在遍历每个节点时、先判断当前节点的右方向是否能走、如果能走就直接进入当前节点的右边节点、否则才去判断当前节点的下边是否能走、以此类推,直到找到路径或者没有路径
- 因为是深度遍历、因此借助递归的思想、此处我们C++STL容器适配器的栈、帮助完成深度遍历
- 我们先将判断入口节点(左上角第一个节点)、如果入口节点是1、那就说明迷宫没有入口、直接返回并打印没有路径,否则就先将第一个节点入栈、然后取出栈顶元素(此时的栈顶元素就是第一个元素),按照上述方式判断当前节点的下一个节点是否位0,也就是能不能走,(注意此处判断的顺序),如果能走就将下一个节点入栈,如果不能走,就将当前节点出栈、最后栈中元素就是路径,当然前提是栈不为空,如果栈为空,就是没有找到路径
- 另外需要注意的一个点就是找过的节点就不再能在找、否则会出现环
注意:我们在这里需要对每个节点进行简单的封装,首先我们每个节点肯定必须有自己的横纵坐标,自己的状态(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 =