采用矩阵+深度优先算法解决迷宫问题

所谓深度优先算法,百科的解答是这样的算法

深度优先搜索算法(Depth-First-Search),简称DFS,是搜索算法的一种。是沿着树的深度遍历树的节点,尽量深的搜索树的分支。当节点v的全部边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的全部节点为止。若是还存在未被发现的节点,则选择其中一个做为源节点并重复以上过程,整个进程反复进行直到全部节点都被访问为止。属于盲目搜索。数组

通俗的说,就是足够“深”的遍历树的全部节点分支而且遍历过的节点不会再去访问,很适合作网络爬虫,你懂得^ ^网络


而迷宫问题也是数据结构里面一道经典的问题了,首先咱们先用矩阵建立一个迷宫;数据结构

const arr = [
        [0,0,0,1,0],
        [0,1,1,1,0],
        [0,1,0,0,0],
        [0,0,0,1,0],
        [0,1,1,1,0]
    ];

其中数字1表明墙壁,数字0表明路,最左上角表明入口,最右下角表明出口,这里咱们不考虑“死路”的状况函数

const arr = [
    [0,0,0,1,0],
    [0,1,1,1,0],
    [0,1,0,0,0],
    [0,0,0,1,0],
    [0,1,1,1,0]
];//建立迷宫

const pathX = [1,-1,0,0];//建立一个数组表明上下左右,在advance这个函数会用到
const pathY = [0,0,-1,1];//同上,区别在于矩阵的行和列
let _arrLength = arr.length-1;
let _arrElementLength = arr[0].length-1;
let i=0,j=0;
(function(){
    console.time("time")//用于测试运算时间

    arr[0][0] = 3;//数字3表明已经走过的路,一开始默认从入口进入

    function matrix(i,j){

        let k,newi,newj;

        for(k = 0;k<4;k++){ //上下左右总共四个方向

            if (advance(i,j,k)) {   
                /*
                经过advance函数的判断返回一个可走的路的点
                */
                newi = i + pathX[k];
                newj = j + pathY[k];   
                
                arr[newi][newj] = 3;//将这个点定义为已走过的点
                
                /*
                判断此时是否已经到了终点若是没有则递归
                */
                if (newi == _arrLength && newj == _arrElementLength) {
                    end()
                } else {   
                    matrix(newi,newj);   
                }   
            }
        }
        arr[i][j] = 2

    }
    matrix(0,0)

    function advance(i,j,k){
        var bool = true;
         /*
        每走一步路就判断其上下左右是否还有路可走
        */
        i += pathX[k];
        j += pathY[k];
        /*
        判断临界范围,保证在迷宫范围内
        */
        if(i<0||i>_arrLength||j<0||j>_arrElementLength){
            bool = false;
        }else if(arr[i][j]!=0){
            bool = false;
        }
        return bool;
    }


    /*
    负责输出结果
    */
    function end(){
        let i,j,newArr=[];
        for (i = 0; i < _arrLength+1; i++) {   
            for (j = 0; j < _arrLength+1; j++) {   
                if (arr[i][j] == 3) { 
                    newArr.push("V");  
                } else {   
                    newArr.push("*");   
                }
            }   
        }
        /*
        下面这段代码只是为了可以在控制台看得更直观,可无,由于写得有点笨拙
        */
        newArr.splice(0,0,"")
        newArr.splice(6,0,"\n");
        newArr.splice(12,0,"\n");
        newArr.splice(18,0,"\n");
        newArr.splice(24,0,"\n");
        console.log(newArr.join(" "));
    }
    console.timeEnd("time")
})()

最终的路线图以下测试

图片描述

相关文章
相关标签/搜索