为了保证在任何位置上都能沿原路退回,显然需用一个后进先出的结构来保存从入口到当前位置的路径,算法中提到的当前位置可通,指的是未曾走到过的通道块,即要求该方块位置不仅是通道块,而且既不在当前路径上(否则所求路径就不是简单路径),也不是曾经纳入过路径的通道块(否则只能在死胡同内转圈)
typedef struct{
int ord; //通道块在路径上的“序号”
PosType seat; //通道块在迷宫中的“坐标位置”
int di; //从此通道块走向下一通道块的“方向”
}SElemType; //栈的元素类型
Status MazePath(MazeType maze,PosType start,PosType end){
//若迷宫maze中存在从入口start到 出口end的通道,则求得一条存放在栈中(从栈底到栈顶),并返回TRUE,否则返回FALSE
InitStack(S); curpos=start; //设定当前位置为入口位置
curpos=1; //探索第一步
do{
if(Pass(curpos)){ //当前位置可以通过,即是未走到过的通道块
FootPrint(cuepos); //留下足迹
e=(curstep,curpos,1);
Push(S,e);
if(curpos==end) return (TRUE); //到达终点
curpos=NextPos(curpos,1); //下一位置是当前位置的东邻
curpos++; //探索下一步
}//if
else{ //当前位置不能通过
if(!StackEmpty(S)){
Pop(S,e);
while(e.di==4&&!StackEmpty(S)){
MarkPrint(e.seat); Pop(S,e); //留下不能通过的标记,并退回一步
}//while
if(e.di<4){
e.di++;Push(S,e); //换下一个方向探索
curpos=NextPos(e.seat,e.di); //设定当前位置是该方向上的相邻块
}//if
}//if
}//else
}//while(!StackEmpty(S));
return(FALSE);
}//MazePath