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;
}