深度优先搜索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 ;
            }
        }
    }
}

喜欢的可以关注公众号查看更多的文章

posted @ 2021-08-16 20:06  yew0  阅读(53)  评论(0编辑  收藏  举报