AcWing 5565. 残垣断壁 -- bfs模板题 填涂颜色

贝茜盖了一面长方形的墙,该墙恰好由 \(N \times M\) 个边长为 \(1\) 的正方形砖块堆叠而成。

作为一头缺乏生活常识的奶牛,它并不懂得使用水泥等胶凝材料让墙变得坚固。

所以仅仅一场台风,就让该墙变为了残垣断壁。

墙面上的一些砖块还存在(用 B 表示),另一些砖块已经消失了(用 . 表示)。

受重力影响,每个幸存的砖块要么位于地面上(最下面一行),要么位于另一块砖块的顶部,不会出现浮空而立的超自然情况。

给定墙面的现状,请你分析当前墙面中一共包含多少个由砖块构成的连通块。

每个砖块视为与其上、下、左、右四个邻近砖块相连。

输入格式

第一行包含两个整数 \(N,M\)

接下来 \(N\) 行,包含一个 \(N \times M\) 的由 B. 构成的字符矩阵,表示整面墙体的当前状况。

输入保证至少存在一个砖块。

输出格式

一个整数,表示当前墙面中包含的由砖块构成的连通块的数量。

数据范围

\(3\) 个测试点满足 \(1 \le N,M \le 10\)
所有测试点满足 \(1 \le N,M \le 100\)

输入样例1:

3 7
.......
.......
.BB.B..

输出样例1:

2

输入样例2:

4 5
..B..
..B..
B.B.B
BBB.B

输出样例2:

2

输入样例3:

4 6
..B...
B.B.BB
BBB.BB
BBBBBB

输出样例3:

1

题解

考试想起来和这个题类似的只有岛屿个数了
https://www.acwing.com/solution/content/237185/
我是按照这个母题做的 又做复杂了 注意点就是两个函数里st[x][y]一定要优先记录 要不然忘了

#include <bits/stdc++.h>

using namespace std;

const int N = 110;

typedef pair<int, int> PII;

char g[N][N];
bool st[N][N];
int n, m;
int cnt;
int dx[4] = {1, -1, 0, 0}, dy[4] = {0, 0, 1, -1};

//搜'B'
void bbfs(int x, int y)
{
    st[x][y] = true; //这里搜之前一定要先记录x,y已经搜过了 要不然就重复搜了  考试的时候debug半天 或者放在下面也行(感觉放在下面更容易记住)
    cnt ++ ;
    queue<PII> q;
    q.push({x, y});
    while (q.size())
    {
        auto t = q.front();
        q.pop();
        for (int i = 0; i < 4; i ++ )
        {
            int a = t.first + dx[i], b = t.second + dy[i];
            if (a >= 0 && a <= n + 1 && b >= 0 && b <= m + 1 && !st[a][b] && g[a][b] == 'B')
            {

                q.push({a, b});
                st[a][b] = true;

            }
        }
    }
}

//搜'.'
void bfs(int x, int y)
{
    queue<PII> q;
    q.push({x, y});
    while (q.size())
    {
        auto t = q.front();
        q.pop();
        for (int i = 0; i < 4; i ++ )
        {
            int a = t.first + dx[i], b = t.second + dy[i];
            if (a >= 0 && a <= n + 1 && b >= 0 && b <= m + 1 && !st[a][b])
            {
                //st[a][b] = true; //或者放这里 感觉放这里更容易记住
                if (g[a][b] != '.')
                {
                    bbfs(a, b);
                }
                else
                {
                    q.push({a, b});
                    st[a][b] = true;
                }

            }
        }
    }
}

int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i ++ )
    {
        for (int j = 1; j <= m; j ++ )
        {
            cin >> g[i][j];
        }
    }
    for (int i = 0; i <= m + 1; i ++ ) g[0][i] = '.';
    for (int i = 0; i <= n + 1; i ++ ) g[i][0] = '.';
    for (int i = 0; i <= m + 1; i ++ ) g[n + 1][i] = '.';
    for (int i = 0; i <= n + 1; i ++ ) g[i][m + 1] = '.';

    bfs(0, 0);
    cout << cnt << endl;
}
posted @ 2024-04-16 16:28  MsEEi  阅读(8)  评论(0)    收藏  举报