《題目》:
給出乙個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裡...