DFS與BFS的應用

2021-10-08 03:00:11 字數 1685 閱讀 6471

《題目》:

給出乙個n*m矩陣,矩陣中的元素為0或1,稱位置(x,y)與其上下左右四個位置(x,y+1)(x,y-1),(x-1,y),(x+1,y)是相鄰的。如果矩陣中有若干個1是相鄰的(不必兩兩相鄰)那麼稱這些1構成了乙個「塊」。求給定的矩陣中「塊」的個數。如

0 1 1 1 0 0 1

0 0 1 0 0 0 0

0 0 0 0 1 0 0

0 0 0 1 1 1 0

1 1 1 0 1 0 0

1 1 1 1 0 0 0的矩陣中「塊」的個數為4

先用dfs的遞迴演算法實現一下!

/!!!!!我寫出來啦! 

#include

#include

using

namespace std;

struct nodenode;

const

int maxn =

100;

int n,m,matrix[maxn]

[maxn]

;//大小為n*m矩陣

bool inq[maxn]

[maxn]=;

int x[4]

=;int y[4]

=;//判斷是否需要訪問,矩陣下標從0開始

bool

judge

(int x,

int y)

void

dfs(

int x,

int y)

//inq[newx][newy]=true;

}return;}

intmain()

}int ans=0;

for(

int i=

0;i}printf

("%d"

,ans);}

/*6 7

0 1 1 1 0 0 1

0 0 1 0 0 0 0

0 0 0 0 1 0 0

0 0 0 1 1 1 0

1 1 1 0 1 0 0

1 1 1 1 0 0 0

*/

再用bfs的非遞迴演算法實現(借助佇列)

//bfs用了佇列的思想 

#include

#include

using

namespace std;

struct nodenode;

const

int maxn =

100;

int n,m,matrix[maxn]

[maxn]

;//大小為n*m矩陣

bool inq[maxn]

[maxn]

;int x[4]

=;int y[4]

=;//判斷是否需要訪問,矩陣下標從0開始

bool

judge

(int x,

int y)

//進行廣度優先搜尋,即只考慮搜尋這一層面

void

bfs(

int x,

int y)}}

}int

main()

}int ans=0;

for(

int i=

0;i}printf

("%d"

,ans)

;}

dfs和bfs的應用

dfs 能找到可行的路徑,所需時間長,需要標記位置 bfs 能找到最短的路徑,所需空間長,需要出入佇列 兩個搜尋的相同點是都利用了二維陣列的圖,有的時候都用了標記方法。但是dfs,我覺得沒什麼變化,就這樣了。但是bfs,1.可以用stl的queue,但是,沒辦法對付路徑記錄。2.可以用自己寫的結構體...

dfs與bfs的錯誤

n 皇后問題是指將 n 個皇后放在 n n 的西洋棋棋盤上,使得皇后不能相互攻擊到,即任意兩個皇后都不能處於同一行 同一列或同一斜線上。現在給定整數n,請你輸出所有的滿足條件的棋子擺法。輸入格式 共一行,包含整數n。輸出格式 每個解決方案佔n行,每行輸出乙個長度為n的字串,用來表示完整的棋盤狀態。其...

BFS與DFS演算法

dfs總結 首先,我們先了解一下bfs,bfs又稱廣度優先搜尋,一般都是用於解決一些圖,樹的遍歷問題。其實廣度優先搜尋就類似與二叉樹的層序遍歷過程,需要借助c 中stl裡面的queue佇列容器來實現這個過程。它其實就是一種分層查詢的過程,每次向前走一步,都會去訪問一批可以訪問的節點,不會存在dfs裡...