js-DFS(深搜)演算法
阿新 • • 發佈:2020-11-04
深度優先搜尋演算法(Depth-First-Search)
:是一種用於遍歷或搜尋樹或圖的演算法。 沿著樹的深度遍歷樹的節點,儘可能深的搜尋樹的分支。當節點v的所在邊都己被探尋過或者在搜尋時結點不滿足條件,搜尋將回溯到發現節點v的那條邊的起始節點。整個程序反覆進行直到所有節點都被訪問為止。
思想:一直往深處走,直到找到解或者走不下去為止 主要步驟: 1.構建一個遞迴函式,函式引數應該最起碼包括題目需求使用的引數 2.找到邊界,遞迴函式裡首先列出遞迴結束的條件,即滿足要求或者超出範圍 3.接著列出所有可能移動或者變化的路徑 void dfs(int step,...) { if(走不下去了) // 判斷邊界 { 相應操作; } // 列舉每一種可能 if(滿足條件) dfs(step+1,...); if(滿足條件) dfs(step-2,...); }
例題:
一,李白打酒
話說大詩人李白,一生好飲。幸好他從不開車。
一天,他提著酒壺,從家裡出來,酒壺中有酒2鬥。他邊走邊唱:
無事街上走,提壺去打酒。
逢店加一倍,遇花喝一斗。
這一路上,他一共遇到店5次,遇到花10次,已知最後一次遇到的是花,他正好把酒喝光了。
請你計算李白遇到店和花的次序,可以把遇店記為a,遇花記為b。則:babaabbabbabbbb 就是合理的次序。像這樣的答案一共有多少呢?請你計算出所有可能方案的個數(包含題目給出的)。
注意:通過瀏覽器提交答案。答案是個整數。不要書寫任何多餘的內容。
分析:運用DFS演算法,當遇見店時酒乘一倍,遇見花時酒減1,直到店和花都為0時,輸出酒的數值。 #include <iostream> using namespace std; int ans=0; void dfs(int dian,int hua,int jiu){ if(dian==0 && hua==0 && jiu==1){//出口 ans++; } //列舉可能情況 if(dian>0) dfs(dian-1,hua,jiu*2); if(hua>0) dfs(dian,hua-1,jiu-1); } int main(){ int n; dfs(5,9,2); cout<<ans; return 0; } 答案:14
二,第39級臺階
小明剛剛看完電影《第39級臺階》,離開電影院的時候,他數了數禮堂前的臺階數,恰好是39級!
站在臺階前,他突然又想著一個問題:
如果我每一步只能邁上1個或2個臺階。先邁左腳,然後左右交替,最後一步是邁右腳,也就是說一共要走偶數步。那麼,上完39級臺階,有多少種不同的上法呢?
請你利用計算機的優勢,幫助小明尋找答案。
要求提交的是一個整數。
注意:不要提交解答過程,或其它的輔助說明文字。
分析:運用DFS演算法 #include <iostream> using namespace std; int ans; void f(int n,int step){//n:剩下的階梯數 step:已走的步數 if(n<0)//錯誤走法 return; if(n==0&&step%2==0){//階梯數走完且步數為偶數 ans++; } f(n-1,step+1);//一步邁上1個臺階 f(n-2,step+1);//一步邁上2個臺階 } int main() { f(39,0); cout<<ans<<endl; return 0; }