求细胞个数
题目
题目描述
一矩形阵列由数字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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器