一、栈实现迷宫问题:
问题描述:用一个二维数组模拟迷宫,其中1为墙,0为通路,用栈方法判断迷宫是否有出口,下图为简单模拟的迷宫:
思想:
1.首先给出入口点,如上图入口点坐标为{2,0};
2.从入口点出发,在其上下左右四个方向试探,若为通路(值为0)时,则向前走,并将每次通路结点入栈(push)保存和标记走过的路为2;
3.当四个方向都没有通路时,则开始回溯,将栈中保存的结点开始pop,并将每个pop位置标记为3,直到在一个位置重新找到新的路,若没有新路,栈最终将为空,即迷宫没有出口;
4.当栈不为空,并且如在上图例子中找到位置{9,2},即其横坐标=行数-1时,则找到迷宫出口,此时栈中保存着这条通路路径。
代码实现:
#include <iostream>
#include <cstdlib>
#include <assert.h>
#include <stack>
using namespace std;
const size_t N=10;
struct Pos
{
int _row;
int _col;
};
bool CheakIsAccess(int *maze,size_t n,Pos pos) //判断每走一次是否为通路(栈)
{
if((maze[pos._row*n+pos._col]==0)&&(pos._row>=0&&pos._row<n)&&(pos._col>=0&&pos._col<n))
{
return true;
}
return false;
}
bool GetMazePath(int *maze,size_t n,Pos entry,stack<Pos> &path) //栈方法判断迷宫是否有出口
{
assert(maze);
Pos cur=entry; //cur保存当前位置
path.push(cur);
Pos next=cur; //next保存下一个位置
while(!path.empty())
{
cur=path.top();
maze[cur._row*n+cur._col]=2; //标记走过的路
if(cur._row==n-1) //找到一条通路
{
return true;
}
//试探法:上下左右判断是否有通路
//上
next=cur;
next._row-=1;
if(CheakIsAccess(maze,n,next))
{
path.push(next);
contin