演算法筆記 DFS BFS

2021-10-04 05:21:00 字數 4042 閱讀 8544

深度優先搜尋(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 如果陣列為空...