JS实现“老鼠走迷宫”算法

问题描述

给定一个二维数组,数组中2表示墙壁,0表示通路,由此数组可展示为一个迷宫图。给定入口位置和出口位置,判断之间是否存在通路并显示出走出迷宫的道路。

思路

实际上是使用回溯算法求解该问题,就是在上下左右四个方向试探,倘若有路则走一步,在新的位置继续在四个位置试探,并且对走过的路进行标记,倘若走到死胡同里,则退回上一步再来试探,以此类推,使用递归来实现。

JS代码

//递归实现老鼠走迷宫算法
// 定义的迷宫
let maze = [
  ["2","2","2","2","2","2","2","2","2"],  
  ["2","0","0","0","0","0","0","0","2"],  
  ["2","0","2","2","0","2","2","0","2"],  
  ["2","0","2","0","0","2","0","0","2"],  
  ["2","0","2","0","2","0","2","0","2"],  
  ["2","0","0","0","0","0","2","0","2"],  
  ["2","2","2","2","2","2","2","0","2"],  
  ["2","0","0","0","0","0","0","0","2"],  
  ["2","2","2","2","2","2","2","0","2"]  
] 
begin_x = 1;           //迷宫入口横坐标
begin_y = 1;           //迷宫入口纵坐标
end_x = 8;             //迷宫出口横坐标
end_y = 7;             //迷宫出口纵坐标
let flag = false;      //定义标志位,判断老鼠有没有出迷宫
let total = 0;         //有多少条路线可以出去
let loop = maze.slice(0);  //数组深拷贝,用于绘制路线。切忌maze_loop = maze;这是浅拷贝。 

//设计算法让老鼠移动
function findLoop(arr,start_x,start_y){
  arr[start_x][start_y] = 1;    //走一步做一个标记,表明已经走过这个格子了,不能走这个格子,只能往下走。
  loop[start_x][start_y] = '#'; //标记路线
  //到达迷宫出口
  if((start_x===end_x)&&(start_y===end_y)){
    flag=true;
    console.log(loop);  //打印迷宫路线
  }else if(flag!==true){
    try{
      //定义上 下 左 右移动
      if(arr[start_x][start_y-1]==0&&!flag){
        findLoop(arr,start_x,start_y-1)
      }
      if(arr[start_x][start_y+1]==0&&!flag){
        findLoop(arr,start_x,start_y+1)
      }
      if(arr[start_x-1][start_y]==0&&!flag){
        findLoop(arr,start_x-1,start_y)
      }
      if(arr[start_x+1][start_y]==0&&!flag){
        findLoop(arr,start_x+1,start_y)
      }
      if(!flag){
        //如果走不通了,我就倒回去,把最开始的标记清除。重新选择另一条路。
        loop[start_x][start_y] = "0";
        arr[start_x][start_y] = "0";
      }
    }catch(error){
      //避免因没有找到出去的路,而造成死循环,堆栈溢出
      console.log('这个迷宫没有出路',error);
    }
  }
  return flag==false?'真遗憾,小老鼠走不出去了':'小老鼠成功走出迷宫';
}
findLoop(maze,begin_x,begin_y)

结果

定义的迷宫

其中"#"表示小老鼠走出去的路线
迷宫路线图

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值