深度優先搜尋是一種圖的走訪方式。以一個圖的例子來解釋:圖上有編號為 到 的節點。如果我們從節點 開始走,我們會先往與節點 相鄰的節點走,然後一直往下走,直到無法再往下走為止。接著,我們會回到上一層,再以相同的方式往另一個相鄰節點走。
通常,我們實現深度優先搜尋會使用遞迴的方式,或者更深入的概念是使用堆疊(stack)。但值得注意的是,在遞迴過程中,函數的呼叫實際上就已經包含了堆疊的操作,因此我們不需要手動操作堆疊。
簡易範例實作 code:
void dfs(int depth,int start){
if(depth == k){
for(int i = 0;i < k;i++){
cout << ans[i] << " ";
}
return;
}else{
for(int i = start;i < n;i++){
ans[depth] = num[i];
dfs(depth + 1,i);
}
}
}
此為 DFS 的變化型,用於通過 DFS 方式訪問各種可能的結果,也可以視為圖中各種可能的走法。DFS 通常用於計算骰子點數、多個號碼的排列組合、撲克牌的排列組合等問題。這些問題通常需要額外的記憶體空間來儲存答案,在 DFS 的遞迴深度達到預期深度後才一次性輸出結果。
在明天會有相關類題給大家練習
DFS 除了上述的應用之外,還可以用於更多領域,例如在樹的遍歷、拓撲排序、八皇后問題、數獨解題等等。不過,我的目標是確保大家可以輕鬆理解 DFS 的概念和簡單實作,所以目前不會深入介紹這些例子。如果你對它們感興趣,可以參考之前的資源分享,那裡有許多相關的文章和示例。
深度優先搜尋(DFS)是一種圖形遍歷方法,適用於各種應用,從圖形遍歷到排列組合等不同領域。我們從一個起點開始,遞迴地深入探索,然後回溯以繼續其他可能的選擇
在這篇文章中,我們介紹了基本概念,提供簡單的實作示例,並討論變種應用,例如暴搜。我們也提到困難應用,如在樹的遍歷、拓撲排序、八皇后、數獨求解等。
儘管 DFS 可以應用於各種複雜的問題,但本文的目標是幫助讀者建立對 DFS 的基本理解並提供入門實作示例,所以就只有基本概念。希望這篇文章能夠幫助你開始使用學習 DFS,並解決各種問題。