题目描述
一个m*n的方格图,一些格子被涂成了黑色,在方格图中被标为1,白色格子标为0。问有多少个四连通的黑色格子连通块。四连通的黑色格子连通块指的是一片由黑色格子组成的区域,其中的每个黑色格子能通过四连通的走法(上下左右),只走黑色格子,到达该联通块中的其它黑色格子。
输入:
3 4
1 1 1 0
1 1 0 0
0 0 0 1
输出 :
2
1、bfs求解
连通快的个数=搜索的次数,使用队列数据结构。
#include<iostream>
#include<queue>
using namespace std;
int a[1005][1005],ans=0,m, n;
int f[4][2]= {
{
0,1},{
0,-1},{
1,0},{
-1,0}}; // 四个方向
struct node {
int x,y;
} Node;
queue<node> q;
void bfs(int i ,int j) {
Node = {
i,j};
q.push(Node);
a[i][j]=0;
while(!q.empty()) {
node top = q.front();
q.pop();
// bfs 四个方向遍历
for(int i=0; i<4; i++) {
int dx = top.x+f[i][0];
int dy = top.y+f[i][1];
// 判断是否有效判定是否将节点加入队列
if(dx>=0 && dy>=0 && dx<m && dy<n && a[dx][dy]==1) {
a[dx][dy]=0;
Node = {
dx,dy};
q.push(Node);
}
}
}
}
// 连通块问题 m*n的二维数组
int main() {
cin >>m>> n;
for(int i=0; i<m; i++) {
// 输入元素
for(int j=0; j<n; j++) {
cin >> a[i][j];
}
}
for(int i=0; i<m; i++) {
for(int j=0; j<n; j++) {
if(a[i][j]==1) {
bfs(i,j);
ans++;
}
}
}
cout << ans <<endl;
}
2、dfs(深度优先搜索)
#include<iostream>
#include<queue>
using namespace std;
int a[1005][1005],ans=0, m,n;
int f[4][2]= {
{
0,1},{
0,-1},{
1,0},{
-1,0}};
struct node {
int x,y;
} Node;
void dfs(int x ,int y) {
a[x][y]=0;
for(int i=0; i<4; i++) {
int dx = x+f[i][0];
int dy = y+f[i][1];
if(dx>=0 && dy>=0 && dx<m && dy<n && a[dx][dy]==1) {
a[dx][dy]=0;
dfs(dx,dy);
}
}
}
// 连通块问题 m*n的二维数组
int main() {
cin >>m>> n;
for(int i=0; i<m; i++) {
// 输入元素
for(int j=0; j<n; j++) {
cin >> a[i][j];
}
}
for(int i=0; i<n; i++) {
for(int j=0; j<n; j++) {
if(a[i][j]==1) {
dfs(i,j);
ans++;
}
}
}
cout << ans <<endl;
}