1. 程式人生 > 其它 >深度優先搜尋DFS(一)

深度優先搜尋DFS(一)

  深度優先搜尋演算法(Depth-First-Search,DFS)是一種圖的搜尋演算法,它遍歷或者搜尋樹、圖,沿著一條路或者一個分支一路遍歷下去,直到最深的分支節點或者路的盡頭,再往回回溯,遍歷其他的分支或者其他路,直到找到目標為止。

  遍歷一課樹的流程,從頂點a先遍歷左節點b,再往b的左節點d遍歷,節點d往下沒有節點,往回回溯到節點b,再遍歷節點b的右節點e,節點e往下沒有節點,往回回溯到節點b,節點b的子節點都已經遍歷完,再往回回溯到節點a,遍歷節點a的右節點c,往下遍歷節點c的左節點f,節點f往下沒有節點,回溯到節點c,再遍歷節點c的右節點g,節點g往下沒有節點,回溯到節點c,節點c的子節點都遍歷完,回溯到節點a,節點a的子節點都遍歷完,遍歷結束。

遍歷的完整順序是a,b,d,e,c,f,g

struct Node
{
    Node(char a) {
        c = a;
        left = nullptr;
        right = nullptr;
    }
    char c;
    Node* left;
    Node* right;
};

void DFS(Node* phead) {
    if(phead == nullptr) {
        return ;
    }
    // 列印節點
    printf("%c ", phead->c);
    if(phead->left != nullptr) {
        DFS(phead
->left); } if(phead->right != nullptr) { DFS(phead->right); } }

  遍的歷圖,S為開始的位置,E為迷宮的出口,X為障礙物,.為可以走的方格。遍歷的方向為右左上下進行,迷宮下面的正方形圖代表的是進入遞迴的座標;

(1)從圖的(0,0)開始進行遍歷,(2)當前方格可以往右走,(0,1)進入遞迴函式,(3)標記已經是走過的方格,(4)走到(0,1),(5)當前方格可以往右走,(0,2)進入遞迴函式;

(6)標記已經是走過的方格,(7)走到(0,2),(0,2)往右走超出圖,往左走是障礙物,往上超出圖,往下走是障礙物,當前方格已經是盡頭,(8)回溯到上一次走過的方格(0,1),(9)當前方格右邊已經遍歷,左邊是開始位置,往下可以走,(10)標記已經是走過的方格;

(11)走到(1,1),(12)當前位置右左上都是障礙,只能往下走,(13)標記已經是走過的方格,(14)往右走是終點,程式結束。

void DFS(char* pMap, int x, int y, int nWidth, int nHeight, bool& bFlag) {
    if(bFlag) {
        return ;
    }
    int nStep[][2] = {{1,0}, {-1,0}, {0,-1}, {0,1}};
    for(int i=0; i<4; i++) {
        int nNewx = x + nStep[i][0];
        int nNewy = y + nStep[i][1];
        if((nNewx >= 0 && nNewx < nWidth) && (nNewy >= 0 && nNewy < nHeight)) {
            int s = nNewx + nNewy * nWidth;
            if(pMap[s] == '.') {
                pMap[s] = 'X';
                DFS(pMap, nNewx, nNewy, nWidth, nHeight, bFlag);
            }
            else if(pMap[s] == 'E') {
                bFlag = true;
                return ;
            }
        }
    }
}

喜歡的可以關注公眾號檢視更多的文章