迷宫寻路算法-js-深度优先搜索

最近一直在看《啊哈!算法》,根据第四章的迷宫算法写了一个js版的,代码如下:

//迷宫寻路算法,求最短路径
var n=5;//迷宫是5*5的方形
var src=[0,0];//起点
var des=[2,3];//终点
var next=[[0,-1],[0,1],[-1,0],[1,0]];//下一步的方位,上、下、左、右
var palace=[];//初始化迷宫
for(var i=0;i<n;i++){
    for(var j=0;j<n;j++){
        palace.push([i,j,1]);//前两位是xy坐标,最后一位为状态值,0表示不可行,1表示可行
    }
}
//设置墙
var wall=[[0,1],[1,3],[3,3]];
for(var i=0;i<wall.length;i++){
    palace[wall[i][0]*n+wall[i][1]][2]=0;//设为墙
}

console.log("输出迷宫");
drawPalace();
function drawPalace(){
    console.log("  ——————————");
    for(var i=0;i<n;i++){
        var shower=i+" ";
        for(var j=0;j<n;j++){
            if(i==src[0] && j==src[1]){
                shower+="▲ ";//起点
            }else if(i==des[0] && j==des[1]){
                shower+="● ";//目标
            }else if(palace[i*n+j][2]==0){
                shower+="# ";//墙
            }else if(palace[i*n+j][2]==1){
                shower+="□ ";//空地
            }else if(palace[i*n+j][2]==2){
                shower+="■■";//路径
            }

        }   
        console.log(shower+"|");
    }
    console.log("  ——————————");
}

var min=n*n+1;//用于记录最小路径长度
var map=[];

//寻路算法
function search(pos,step,result){//pos记录当前坐标,step记录步数
    //边界条件
    if(pos[0]==des[0] && pos[1]==des[1]){//如果到达了目的地
        if(step<min){
            map=[];
            for(var j=0;j<result.length;j++){
                map.push(result[j]);
            }
            min=step;//如果当前抵达步数比最小值小,则修改最小值
            result=[];
        }
    }
    //递归
    for(var i=0;i<next.length;i++){
        var tmpos=(pos[0]+next[i][0])*n+pos[1]+next[i][1];//下一步的坐标  
        if(pos[0]+next[i][0]<0 || pos[0]+next[i][0]>=n || pos[1]+next[i][1]<0 || pos[1]+next[i][1]>=n)
            continue;//如果下一步越界继续循环,尝试下一个方向
        else if(palace[tmpos] && palace[tmpos][2]==1)//如果下一步不是墙
        {
            palace[tmpos][2]=0;//标记已经走过
            result.push([pos[0]+next[i][0],pos[1]+next[i][1]]);
            search([pos[0]+next[i][0],pos[1]+next[i][1]],step+1,result);
            palace[tmpos][2]=1;//尝试结束,取消标记
            result.pop();
        }
    }
}
palace[0][2]=0;
search(src,0,[]);//从起点开始,初始化步数为0
if(min<=n*n){
    console.log("从起点",src,"到终点",des,"最短路径长为:",min,"最短路径为:");
    console.log(src);
    for(var i=0;i<map.length;i++){
        console.log("=>[",map[i][0],",",map[i][1],"]");
        palace[map[i][0]*n+map[i][1]][2]=2;
    }
    console.log("绘制路径");
    drawPalace();
}else{
    console.log("找不到路径到达");
}
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值