迷宫求解
算法简单描述如下:
方法:从入口出发,顺某一方向向前探索,若能走通,则继续往前走,否则沿原路退回,换一个方向继续探索,直到所有可能的通路都探索到为止,为了能按原路返回,需要一个“栈”来保存从入口到当前位置的路径
当前位置:在搜索过程中某一时刻所在途中某个方块的位置
设当前位置的初值为入口位置:
Do{
若当前位置可通:
则{ 将当前位置入栈,
若该位置是出口,则结束
否则切换当前位置的东邻块为新的当前位置
}
否则 ,
若栈不空且栈顶位置尚有其他方向为探索,
则设定新的当前位置为沿顺时针方向找到的栈顶位置的下一相邻块
若栈不空但栈顶位置的四周均不通,
则{ 删除栈顶位置
若栈不空,则重新测试新的栈顶位置,直到找到一个可通的相邻块或出栈至栈空}
}while (栈不空)
算法如下:
Status Mazepath(Mazetype maze,postype start,postype end)
{ Initstack(S); curpos=start;// 当前位置为“入口位置”
curstep=1 //通道块在路径中的“序号”
do{
if (pass(curpos)){
FootPrint(curpos); //留下足迹
e=(cursetp,curpos,1);
push(S,e); //加入路径
if(curpos==end) return(true); //到达终点
curpos=Nextpos(curpos,1); //下一位置
curstep++; 继续下一步
}
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