这里的迷宫问题是将一个二位数组看作是迷宫,里面的数值1为墙,是死路,而0则是通路。
例如下图之中,(1,0)是迷宫入口,红线部分为一条迷宫通路,而后面的黑色圆圈圈住的部分就是一个死胡同
而在一个迷宫之中,是会有多条路径可以走出迷宫,今天的任务就是要找到最短的那条路径。
求解迷宫出口的算法是使用递归,从入口进入迷宫,然后从入口的上右下左(顺时针方向,方向可自定义)四个方向探测,探测到下一个位置是通路时可以走,将来时的路做标记 ,并将下一个点变成新的入口(递归子问题), 以此类推,便可以找到所有通路。
struct Pos //用于存储迷宫位置的行列
{
int _row;//行
int _col;//列
};
template <int M,int N>
class Maze
{
public:
Maze(int* maze)//用于初始化
{......}
void Print();//用于显示
bool CheckIsAccess(Pos cur, Pos next);//判断是否可以通
void GetShortPath(Pos cur, stack<Pos>& path, stack<Pos>& shortpath);//标记、寻找通路以及判断最优解
~Maze()
{}
protected:
int _maze[M][N];
};
利用这几个函数就可以完成所有工作,一个个来看
首先用于显示的Print()函数就是二位数组的显示方法,而CheckIsAccess(cur,next)中,cur为当前的坐标位置,nxet为下一个坐标位置,也是需要判断的位置。当next处的值为0(最原始通路为0)是,肯定可以通过,而标记过后0值被改变,但不影响他的通过性。这里标记放法是在入口处将0换为2,后续通路的值依次递增。
bool CheckIsAccess(Pos cur, Pos next)//判断是否可以通(