1329:【例8.2】细胞(bfs)

【题目描述】

一矩形阵列由数字00到99组成,数字11到99代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。如:

阵列

4 10
0234500067
1034560500
2045600671
0000000089

有44个细胞。

【输入】

第一行为矩阵的行nn和列mm;

下面为一个n×mn×m的矩阵。

【输出】

细胞个数。

【输入样例】

4 10
0234500067
1034560500
2045600671
0000000089

【输出样例】

4

主函数干4件事:输入,查找,bfs,输出

bfs里,不停联通,将连起来的方块标记

代码:

#include
using namespace std;
char mat[111 + 5][111 + 5];
int n, m;
int vis[111 + 5][111 + 5];
bool good(int x, int y) {
	if (x >= 0 && x < n && y >= 0 && y < m && !vis[x][y] && mat[x][y] != '0') {
		return true;
	}
	return false;
}
//判断越界问题和是否标记以及字符
struct node {
	int x, y;
};
void bfs(int x0, int y0) {
	vis[x0][y0] = 1;
	queueq;
	q.push({x0, y0});
	while (!q.empty()) {
		node t = q.front();
		q.pop();
		int x = t.x;
		int y = t.y;
		if (good(x + 1, y)) {
			q.push({x + 1, y});
			vis[x + 1][y] = 1;
		}//上
		if (good(x - 1, y)) {
			q.push({x - 1, y});
			vis[x - 1][y] = 1;
		}//下
		if (good(x, y+1)) {
			q.push({x , y+1});
			vis[x ][y+1] = 1;
		}//右
		if (good(x, y-1)) {
			q.push({x , y-1});
			vis[x][y-1] = 1;
		}//左
	}
}
int main() {
	cin >> n >> m;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cin >> mat[i][j];
		}
	}//输入
	int ans = 0;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			if (good(i, j)) {
				ans++;
				bfs(i, j);//找到没标记的,将联通的标记
			}
		}
	}
	cout << ans;
}

你可能感兴趣的:(bfs,c++,算法)