求细胞个数

题目

题目描述

一矩形阵列由数字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

posted @ 2022-03-31 21:37  骆美辰  阅读(116)  评论(0编辑  收藏  举报
lock: { enable: true, background: 'https://img1.baidu.com/it/u=2788089125,168843488&fm=253&app=138&size=w931&n=0&f=JPEG&fmt=auto?sec=1690563600&t=35fa4326e773b3fbf83562ad746b7cd2',//锁屏背景 strings: [ 'Every win named never give up 每一份胜利都叫不放弃',//签名 ], },