深度优先搜索DFS
Posted yew0
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深度优先搜索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 ; } } } }
喜欢的可以关注公众号查看更多的文章
以上是关于深度优先搜索DFS的主要内容,如果未能解决你的问题,请参考以下文章
数据结构与算法图遍历算法 ( 深度优先搜索 DFS | 深度优先搜索和广度优先搜索 | 深度优先搜索基本思想 | 深度优先搜索算法步骤 | 深度优先搜索理论示例 )
深度优先搜索 DFS(Depath First Search, DFS)