BFS寬度搜索(佇列)與DFS深度搜索(遞迴)
阿新 • • 發佈:2019-02-18
1;應用方面
——————bfs寬度搜索用於尋找最優解;
——————dfs深度搜索用於遍歷尋找解;
2;實現原理;
——bfs;利用佇列;層次來搜尋的;
解釋一下圖片;
第一層;–A;
第二層;–BCD;
第三層;–EF;
第四層;–GH;
第4層;–I;
因為他是按層搜尋,就是說只要bfs搜尋到結果那麼一定是最優解;;
來個題目化的;將上圖CI連線,求從A到I最短路徑;依舊劃分層次;第三層就會搜到I;也就是說bfs最先搜到的一定是最優 解;
模板;//結合上圖理解程式碼;
Q={起點s}; 標記s為己訪問;
while (Q非空) {
取Q隊首元素u; u出隊;
所有與u相鄰且未被訪問的點進入佇列;
標記u為已訪問;
}
/// /////////////////////////////////////////////////////////
whlie (佇列不空) {
u = 對隊首元素;
首元素出隊;
for (所有與 u 鄰接點 v) // u 的上 下 左 右
// if(v 的座標在 row, col之內
// 並且 v 不是牆
// 並且 v 未被遍歷)
v 入隊
}
——dfs;利用運用堆疊,遞迴層次搜尋,回溯來遍歷全部;
解釋一下圖片;
利用回溯,一條道路走到底,然後返回上一級,繼續進行搜尋,直到搜尋完畢;
模板;//結合上圖理解程式碼;
void DFS( Point P ) {
for(所有P的鄰接點K){
if(K未被訪問){
標記K;
DFS(K);
//有時候要清空之前的標記;
}
}
}