採用矩陣+深度優先算法解決迷宮問題

所謂深度優先算法,百科的解答是這樣的算法

深度優先搜索算法(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")
})()

最終的路線圖以下測試

圖片描述

相關文章
相關標籤/搜索