迷宫求解2--多出口求最短路径

假如有如下一个迷宫地图:
这里写图片描述
与迷宫求解1中,简单迷宫找路径思路相似,不同的是:这里需要定义两个栈cur_path和short_path,来存放当前路径长度,与最短路径长度,每找到一条路径就与最短路径进行比较,如果比最短路径短,就用当前路径cur_path代替最短路径short_path;
1.判定是否能落脚;
2.如果能落脚进行标记,同时将当前点插入到cur_path顺序栈中;
3.判断当前点是否是出口
a)如果是出口,比较当前cur_path与最短路径short_path的长度
b)如果不是出口,就递归的以顺时针方向继续探测四周
4.如果四个点都探测过了,就进行回溯
解析:
能否落脚的判定规则和标记规则与迷宫求解1中的一样,代码请参考迷宫求解1;

具体代码实现如下:

void MazeInit2(Maze* maze){
     if(maze == NULL){
         return;
   }
     int map[MAX_ROW][MAX_COL] = {
         {0,1,0,0,0,0},
         {0,1,1,1,0,0},
         {0,1,0,1,1,1},
         {1,1,1,0,0,0},
         {0,0,1,0,0,0},
         {0,0,1,0,0,0},
     };
     size_t i = 0;
     for(;i<MAX_ROW;i++){
         size_t j = 0;
         for(;j<MAX_COL;j++){
             maze->map[i][j] = map[i][j];
         }
     }
     return;
 }

 void _GetShortPath(Maze* maze,Point cur,Point         entry,SeqStack* cur_path,SeqStack* short_path){
     if(maze == NULL){
         return;
     }
     //1.判断当前点是否能落脚
     if(!CanStay(maze,cur)){
         return;
     }
     //2.如果能落脚,就对当前点进行标记,同时把当前点插入到cur_path
     Mark(maze,cur);
     SeqStackPush(cur_path,cur);
     //3.判断当前点是否是出口
     if(IsEixt(maze,cur,entry)){                                                                             
         //a)如果是出口,说明找到了一条路径,拿当前路径与最短路径进行比较
         //如果当前路径比最短路径短,或者最短路径为空
         //就用当前路径代替最短路径
         printf("找到一条路径\n");

  if(cur_path->size < short_path->size || short_path->size == 0){
             printf("找到一条较短路径\n");
             SeqStackAssgin(cur_path,short_path);
         }
         //b)如果当前路径没有short_path短,就继续在找其他路径(进行回溯)
         //回溯之前要把cur_path栈顶元素出栈
         SeqStackPop(cur_path);
         return;
     }
     //4.如果当前点不是出口,按照顺时针方向继续探测相邻的四个方向
     Point up = cur;
     up.row -= 1;
     _GetShortPath(maze,up,entry,cur_path,short_path);

     Point right = cur;
     right.col += 1;
     _GetShortPath(maze,right,entry,cur_path,short_path);
     Point down = cur;
     down.row += 1;                                                                                          
     _GetShortPath(maze,down,entry,cur_path,short_path);

     Point left = cur;
     left.col -= 1;
     _GetShortPath(maze,left,entry,cur_path,short_path);

     //5.如果四个方向都探测过了,就可以进行出栈(指当前函数栈帧结束,
     //同时cur_path也要进行出栈),回溯到上一个点
     SeqStackPop(cur_path);
     return;
 }
 //找到所有路径然后从所有路径中筛选出最短的一条(递归 )
 void GetShortPath(Maze* maze,Point entry){
     if(maze == NULL){
         return;
     }
     //就像从一个数组中查找最小元素一样,定义一个最短路径short_path,保存最短路径
     SeqStack cur_path;//保存当前路径
     SeqStack short_path;//保存最短路径
     SeqStackInit(&cur_path);
     SeqStackInit(&short_path);
     _GetShortPath(maze,entry,entry,&cur_path,&short_path);
     SeqStackDebugPrint(&short_path,"最短路径");
 }       
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值