1. 程式人生 > 實用技巧 >js-DFS(深搜)演算法

js-DFS(深搜)演算法

深度優先搜尋演算法(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;       
}
答案:51167078