连通块问题[bfs、dfs求解]

题目描述

一个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;
}

猜你喜欢

转载自blog.csdn.net/VariatioZbw/article/details/118214217