前言
简单问题,写的不好,大佬见谅.
如有疏漏,恳请指正,小编垂首.
问题描述:
有一个迷宫地图,有一些可达的位置,也有一些不可达的位置(障碍、墙壁、边界)。从一个位置到下一个位置只能通过向上(或者向右、或者向下、或者向左)走一步来实现,从起点出发,如何找到一条到达终点的通路。
用二维矩阵来模拟迷宫地图,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]