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 指...