用栈解决迷宫问题

为了保证在任何位置上都能沿原路退回,显然需用一个后进先出的结构来保存从入口到当前位置的路径,算法中提到的当前位置可通,指的是未曾走到过的通道块,即要求该方块位置不仅是通道块,而且既不在当前路径上(否则所求路径就不是简单路径),也不是曾经纳入过路径的通道块(否则只能在死胡同内转圈)

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        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值