深度優先搜尋DFS(一)
阿新 • • 發佈:2021-08-16
深度優先搜尋演算法(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 ; } } } }
喜歡的可以關注公眾號檢視更多的文章