深度優先搜尋和廣度優先搜尋

2022-04-03 12:10:27 字數 2708 閱讀 2045

遞迴問題整理

深搜的

放蘋果 (poj1664):(其實就是整數劃分問題)

把m個同樣的蘋果放在n個同樣的盤子裡,允許有的盤子空著不放,問共有多少種不同的分法? 5,1,1和1,5,1 是同一種分法。(1<=m,n<=10)

如輸入m = 7, n = 3,應輸出8       (7 0 0 )(6 1 0 )(5 2 0 )(5 1 1 )(4 3 0 )(4 2 1 )(3 3 1 )(3 2 2)

參考  

/*

解題分析:

設f(m,n) 為m個蘋果,n個盤子的放法數目,則先對n作討論,

當n>m:必定有n-m個盤子永遠空著,去掉它們對擺放蘋果方法數目不產生影響。即if(n>m) f(m,n) = f(m,m)  

當n<=m:不同的放法可以分成兩類:

1、有至少乙個盤子空著,即相當於f(m,n) = f(m,n-1);

2、所有盤子都有蘋果,相當於先每個盤子放乙個蘋果,一共是n個,然後的m-n的蘋果再分配到m的盤子,即f(m,n) = f(m-n,n).

而總的放蘋果的放法數目等於兩者的和,即 f(m,n) =f(m,n-1)+f(m-n,n)

遞迴出口條件說明:

當n=1時,所有蘋果都必須放在乙個盤子裡,所以返回1;

當沒有蘋果可放時,定義為1種放法;

遞迴的兩條路,第一條n會逐漸減少,終會到達出口n==1;

第二條m會逐漸減少,因為n>m時,我們會return f(m,m) 所以終會到達出口m==0.

*/#include

int fun(int m,int n) //

m個蘋果放在n個盤子中共有幾種方法

intmain()

}

廣義水仙花數如果乙個n位數所有數碼的n次方的和加起來等於這個數字本身,我們把這樣的數叫做廣義水仙花數,容易看出來水仙花數是n = 3的廣義水仙花數現在,我們的任務是,輸入乙個m (m 

3 (153 370 371 407)

5 (54748 92727 93084)

方法:資料規模很小,可以直接列舉所有情況,然後判斷是否滿足條件。

難點:迴圈層數不確定

於是我們現在的問題是,怎麼實現這個m重迴圈?

答案是:遞迴。

#include #include 

using

namespace

std;

intm;

int pow(int x, int

n)//

引數說明

//deep是深度 從1-m curnum是當前的數 curnum是當前的數計算的結果,就是各位方次之後的和

void dfs(int deep, int curnum, int

cursum)

else

if (deep <=m)

}int

main()

return0;

}

全排列問題從n個不同元素中任取m(m≤n)個元素,按照一定的順序排列起來,叫做從n個不同元素中取出m個元素的乙個排列。當m=n時所有的排列情況叫全排列。

這也有資源

#include #include 

void pailie(char *str, int m, int

n)

int length =strlen(str);

for (int i=0;ii)

}}void

main()

框架

深度優先搜尋解決問題的框架

void dfs(int

deep, state curstate)

}else}}

廣度優先搜尋

三個水杯

答案:   

}樹的層序遍歷其實也是一種廣度優先搜尋吧  **不寫了

深度優先搜尋和廣度優先搜尋

深度優先的思想是先記住當前的起點,然後選定乙個方向一條道走到黑,若失敗則回到起點再選定另外乙個方向走到黑。廣度優先的思想是記住當前的起點,然後選定各個方向的相鄰點作為新的起點,再繼續。可以看出,深度優先和廣度優先都需要記住當前的起點,不同的是深度優先每次只需要記住乙個方向的相鄰點,廣度優先則要記住所...

廣度優先搜尋和深度優先搜尋

dbf深度優先搜尋,最經典的方法,可以使用遞迴來實現。結構體定義 typedef char vertextype typedef int edgetype define maxvex 100 define infinite 65535 typedef struct mgraph 測試函式如下 mgr...

深度優先搜尋和廣度優先搜尋

定義 圖 graph 是由頂點的有窮非空集合和頂點之間邊的集合組成,通常表示為 g v,e 其中,g表示乙個圖,v是圖g中頂點的集合,e是圖g中邊的集合.簡單點的說 圖由節點和邊組成。乙個節點可能與眾多節點直接相連,這些節點被稱為鄰居。如二叉樹就為乙個簡單的圖 廣度優先搜尋演算法 breadth f...