深度優先搜尋(dfs)
void
dfs()if
(越界或者是不合法狀態)
return;if
(特殊狀態)
//剪枝
return
;for
(擴充套件方式)
}}
dfs 幾道題目 推薦做一下
例項1(全排列加素數):
已知 n 個整數b1,b2,…,bn
以及乙個整數 k(k<n)。
從 n 個整數中任選 k 個整數相加,可分別得到一系列的和。
例如當 n=4,k=3,4 個整數分別為 3,7,12,19 時,可得全部的組合與它們的和為:
3+7+12=22 3+7+19=29 7+12+19=38 3+12+19=34。
現在,要求你計算出和為素數共有多少種,並給出每種組合的和。
例如上例,只有一種的和為素數:3+7+19=29。
輸入第一行兩個整數:n , k (1<=n<=20,k<n)
第二行n個整數:x1,x2,…,xn (1<=xi<=5000000)
輸出乙個整數(滿足條件的方案數)。
樣例輸入
433
71219
樣例輸出
1
29
#include
using
namespace std;
int sum =0;
int n, k;
int a[
105]
;int p[
105]
;bool vis[
105]
;vector<
int> ans;
bool
isprime
(int sum)
}return
true;}
void
dfs(
int index)
return;}
for(
int i =
1; i <= n; i++)}
}int
main()
dfs(1)
; cout << ans.
size()
<< endl;
for(vector<
int>
::iterator it = ans.
begin()
;it != ans.
end(
); it++
)return0;
}
廣度優先搜尋(bfs)void
bfs(
int s)
}
實現步驟:
定義佇列q,並將起點s入隊
寫乙個while迴圈,迴圈條件是佇列是q非空
在while迴圈中,先取出隊首元素top,然後訪問它(訪問可以是任何事情,例如將其輸出)。訪問完將其出隊。
將top的下一層結點中所有未曾入隊的結點入隊,並標記它們的層號為now的層號加1,同時設定這些入隊的結點已入過隊。
返回步驟2繼續迴圈
例項2:
給出乙個m×n的矩陣,矩陣中的元素為0或1。稱位置(x, y)與其上下左右四個位置(x, y+1)、(x, y-1)、(x+1,y)、(x-1,y)是相鄰的。如果矩陣中有若干個1是相鄰的(不必兩兩相鄰),那麼稱這些1構成了乙個「塊"。求給定的矩陣中」塊「的個數
樣例輸入
670
1110
0100
1000
0000
0100
0001
1101
1101
0011
1100
0
樣例輸出
4
**
#include
#include
using
namespace std;
const
int maxn =
100;
struct node node;
int n, m;
//矩陣大小為n*m
int matrix[maxn]
[maxn]
;//01矩陣
bool inq[maxn]
[maxn]=;
//記錄位置(x, y)是否已入過隊
int x[4]
=;//增量陣列
int y[4]
=;bool
judge
(int x,
int y)
//bfs函式訪問位置(x, y)所在的塊,將該塊中所有"1"的inq都設定為true
void
bfs(
int x,
int y)}}
}int
main()
}int ans =0;
//存放塊數
for(
int x =
0; x < n; x++)}
}printf
("%d\n"
, ans)
;return0;
}
例項3:
給定乙個nm大小的迷宮,其中代表不可通過的牆壁,而」.」代表平地,s表示起點,t代表終點。移動過程中,如果當前位置是(x, y)(下標從0開始),且每次只能前往上下左右(x, y+1)、(x, y-1)、(x+1, y)、(x-1, y)四個位置的平地,求從起點s到達終點t的最少步數。
樣例輸入
55.
....
.*.*
..*s*..*
**..
..t*22
43
樣例輸出
11
**
#include
#include
#include
using
namespace std;
const
int maxn =
100;
struct node s, t, node;
//s為起點,t為終點,node為臨時終點
int n, m;
//n為行,m為列
char maze[maxn]
[maxn]
;//迷宮資訊
bool inq[maxn]
[maxn]=;
//記錄位置(x, y)是否已入過隊
int x[4]
=;//增量陣列
int y[4]
=;//檢測位置(x, y)是否有效
bool
test
(int x,
int y)
intbfs()
for(
int i =
0; i <
4; i++)}
}return-1
;//無法到達終點t時返回-1
}int
main()
maze[i]
[m +1]
='\0';}
scanf
("%d%d%d%d"
,&s.x,
&s.y,
&t.x,
&t.y)
;//起點和終點的座標
s.step =0;
//初始化起點的層數為0, 即s到s的最少步數為0
printf
("%d\n"
,bfs()
);return0;
}
DFS,BFS演算法總結
乙個典型的實現 深度優先遍歷演算法 1 鄰接矩陣的深度優先遍歷演算法 void adjmwgraph depth int v,int visited 故用鄰接矩陣表示圖時,搜尋乙個頂點的所有鄰接點需花費o n 時間,則從n個頂點出發搜尋的時間應為o n 2 即dfs演算法的時間複雜度是 n2 2 鄰...
機試演算法模板 DFS BFS
揹包問題 簡陋版 include using namespace std const int maxn 30 int n,v,maxvalue 0 物品件數n,揹包容量v,最大價值maxvalue int w maxn v maxn index為當前處理的物品的編號 sumw和sumv分別為當前的總...
搜尋演算法 DFS BFS(簡單介紹)
一般步驟 1 把初始狀態放入陣列中,設為當前狀態 2 擴充套件當前的狀態,產生乙個新的狀態放入陣列中,同時把新產生的狀態設為當前狀態 3 判斷當前狀態是否和前面的重複,如果重複則回到上乙個狀態,產生它的另一狀態 4 判斷當前狀態是否為目標狀態,如果是目標,則找到乙個解答,結束演算法。5 如果陣列為空...