深搜和廣搜入門

2021-10-25 05:29:30 字數 1805 閱讀 4391

1.描述:

對每乙個可能的分支路徑深入到不能再深為止,並且每個結點只能訪問一次。

」一條路走到黑,走不了再倒回去「

2.演算法過程:

void dfs(狀態)

1.判斷當前狀態是否合法,合法則繼續執行,否則則回到上次呼叫

2.遍歷每個新狀態,如果新狀態合法,dfs(新狀態)

3.示例:

洛谷:p2802回家

#include

using

namespace std;

int a[10]

[10],v[10]

[10],s1,s2,step,f,n,m;

int dx[4]

=;int dy[4]

=;void

dfs(

int x,

int y,

int t,

int r)

if(a[x]

[y]==3)

//能回家

return;}

if(a[x]

[y]==4)

//回滿血

for(

int i=

0;i<

4;i++

) v[nx]

[ny]++;

dfs(nx,ny,t+

1,r-1)

; v[nx]

[ny]--;

//用完復原 }}

intmain()

}}step=n*m;

//乙個臨界步數

v[s1]

[s2]++;

//經過該點的次數

dfs(s1,s2,0,

6);if

(f==1)

else

return0;

}

1.描述:bfs屬於一種盲目搜尋法,目的是系統地展開並檢查圖中的所有節點,以找尋結果。換句話說,它並不考慮結果的可能位置,徹底地搜尋整張圖,直到找到結果為止。

2.演算法思想:

一層一層的走。

總是每次都把離上一狀態最近的狀態用乙個佇列記錄下來。

記錄之後,檢查佇列是否為空,如果不為空,就將隊首元素彈出,並且以這個狀態為「根節點」進行bfs,直到整個隊列為空為止。

3.示例:

洛谷:p1443 馬的遍歷

#include

using

namespace std;

int dx[8]

=;//馬的方向位置

int dy[8]

=;struct xy //某個點的座標

node,top;

//top存佇列隊首元素

int n,m,a[

405]

[405

],x,y;

//a陣列記錄步數

bool b[

405]

[405];

//bool型別記錄該點之前有沒有走過

void

bfs(

int x,

int y,

int t)

if(b[nx]

[ny]

)//該點之前沒有被走過 }}

}int

main()

printf

("\n");

}return0;

}

廣搜和深搜

一般來說,廣搜常用於找單一的最短路線,或者是規模小的路徑搜尋,它的特點是 搜到就是最優解 而深搜用於找多個解或者是 步數 已知 好比3步就必需達到前提 的標題,它的空間效率高,然則找到的不必定是最優解,必需記實並完成全數搜尋,故一般情況下,深搜需要很是高效的剪枝 優化 像搜尋最短路徑這些的很顯著若是...

深搜和廣搜

深度優先搜尋屬於圖演算法的一種,英文縮寫為dfs即depth first search.其過程簡要來說是對每乙個可能的分支路徑深入到不能再深入為止,而且每個節點只能訪問一次 採用的搜尋方法的特點是盡可能先對縱深方向進行搜尋。基本思路 深度優先遍歷圖的方法是,從圖中某頂點v出發 1 訪問頂點v 2 依...

深搜和廣搜

qq 親密度用的是帶權圖中,每條邊都有乙個 weight 我們可以通過這個權重來表示 qq 好友間的親密度。鄰接矩陣儲存方法 對於無向圖來說,如果頂點 i 與頂點 j 之間有邊,我們就將 a i j 和 a j i 標記為 1 對於有向圖來說,如果頂點 i 到頂點 j 之間,有一條箭頭從頂點 i 指...