我對DFS的理解
我對DFS的理解
[何為DFS]
深度優先搜索(Depth-First-Search),簡稱DFS。是一種常見搜索算法。其方法是從原點不斷一條路擴散,當無路可走時回退來走下一條路,直至找到目標或遍歷。
[框架]
1 int dfs(int n) { 2 if(到達目標)return n; 3 else{ 4 for(int i=0;i<下一步走法數;++i){ 5 int temp=dfs(n+x); 6 if(temp!=-1)return temp; 7 }8 } 9 return -1; 10 }
[我對DFS的理解]
DFS其實十分簡單。它的主旨就是只考慮當下怎麽走,換句話說就是每次函數調用只走一步,走啊走,走啊走,不經意間發現自己走到了就返回結果就可以了。
你遇到一個DFS先不要慌張地想它的全部,什麽遞歸出口啦、下一步怎麽走啦、返回什麽啊······你啥也別想,先寫參數,參數怎麽寫呢?其實無比簡單,肯定得有一或多個參數來表示現在所在的位置吧,其次你得有走到這兒的代價吧比如步數,花費什麽的。一般的DFS有這些參數足以。然後開始寫出口,出口那就更簡單了,直接上if幹就行,只要現在所在的位置是你要的目標位置就返回結果(一般就是剛才的代價)。如果你已經完成出口那麽你的DFS就已經完成一半了。之後就是下一步怎麽走,這個就是異常的簡單了。會走路嗎?會走路就行。只要調用下一層DFS就可以了(註意下一層DFS的參數會變,位置變成要去的位置,代價在原來基礎上加上走這步的代價)。如果下一層DFS的有返回值且是一個有效值就返回這個值。最後就是應對無解,只需在函數返回一個值代表無解就可以了。到此為止DFS就寫完了。是不是無與倫比的簡單呢?
[經典例題]
圖的m著色問題(color) AC題解
N 皇後問題(queen.cpp) AC題解
[如何學好DFS]
DFS應用廣泛,大部分難的DFS都是在走下一步上用工夫。
要想精通需要多見題一定要多寫!一定要多寫!一定要多寫!寫代碼是懶人幹的,但不是給懶到連代碼也懶得寫的人幹的!當你精通DFS後你才可以看到她的美麗,她的簡練,她的強大。
2018-10-12 22:00:58
我對DFS的理解