求细胞个数
题目
题目描述
一矩形阵列由数字0到9组成。我们把数字1到9称为细胞数字,数字0称为非细胞数字。
若一个细胞数字上、下、左、右仍是细胞数字,我们则把这些细胞数字称为同一细胞。 求给定矩形阵列中细胞的个数。
输入
第1行,整数m、n(m表示行,n表示列、1<=m,n<=1001<=m,n<=100)
接下来的m行表示输入的矩形阵列
输出
细胞的个数
样例输入
4 10
0234500067
1034560500
2045600671
0000000089
样例输出
4
思路
经典的bfs,只需要记录x,y。循环遍历每个点,碰到1~9,而且没有走过,ans++,从这个点开始搜索连着的一整块,用一个数组记录,走过的位置和连着一块的位置。
实质上就是一个找连通块的问题,把整个矩阵遍历一遍,然后把它周围八个方块与它相同的全部改成0,直到没有再和它相同的为止。
BFS版本代码
#include <bits/stdc++.h>
using namespace std;
int n, m, ans = 0, dx[8] = {1, -1, 0, 0}, dy[8] = {0, 0, 1, -1}, h[100013][3], zx, zy;
char b[103][103];
bool a[103][103];
void bfs(int x, int y) {
ans++;
a[x][y] = false;
int head = 1, tail = 1;
h[1][1] = x, h[1][2] = y;
while (head <= tail) {
for (int i = 0; i < 4; i++) {
zx = h[head][1] + dx[i];
zy = h[head][2] + dy[i];
if (zx >= 1 && zx <= n && zy >= 1 && zy <= m && a[zx][zy]) {
tail++;
a[zx][zy] = false;
h[tail][1] = zx, h[tail][2] = zy;
}
}
head++;
}
}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++) {
cin >> b[i][j];
if (b[i][j] != '0')
a[i][j] = true;
else
a[i][j] = false;
}
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
if (a[i][j])
bfs(i, j);
cout << ans << endl;
return 0;
}
小编蒟蒻一个,有什么问题请大佬不惜赐教Orz