1. 程式人生 > >我對DFS的理解

我對DFS的理解

多個 temp 寫代碼 col tps 深度 first 皇後 精通

我對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的理解