题目
农夫约翰有一片 的矩形土地。
最近,由于降雨的原因,部分土地被水淹没了。
现在用一个字符矩阵来表示他的土地。
每个单元格内,如果包含雨水,则用”W”表示,如果不含雨水,则用”.”表示。
现在,约翰想知道他的土地中形成了多少片池塘。
每组相连的积水单元格集合可以看作是一片池塘。
每个单元格视为与其上、下、左、右、左上、右上、左下、右下八个邻近单元格相连。
请你输出共有多少片池塘,即矩阵中共有多少片相连的”W”块。
输入格式
第一行包含两个整数 和 。
接下来 行,每行包含 个字符,字符为”W”或”.”,用以表示矩形土地的积水状况,字符之间没有空格。
输出格式
输出一个整数,表示池塘数目。
数据范围
输入样例:
10 12
W........WW.
.WWW.....WWW
....WW...WW.
.........WW.
.........W..
..W......W..
.W.W.....WW.
W.W.W.....W.
.W.W......W.
..W.......W.
输出样例:
3
解题
方法一:BFS
思路
类似于【DFS】求细胞数量,深搜、宽搜都可以做。
代码
#include <iostream>
#include <limits>
#include <queue>
using namespace std;
typedef pair<int, int> PII;
const int N = 1010, DIRS[][2] = {{-1, 0}, {-1, 1}, {0, 1}, {1, 1}, {1, 0}, {1, -1}, {0, -1}, {-1, -1}};
int n, m;
bool g[N][N];
void bfs(int x, int y) {
queue<PII> que;
que.push({x, y});
g[x][y] = false;
while (!que.empty()) {
auto pr = que.front();
que.pop();
x = pr.first, y = pr.second;
for (auto& DIR : DIRS) {
int nx = x + DIR[0], ny = y + DIR[1];
if (nx >= 0 && nx < n && ny >= 0 && ny < m && g[nx][ny]) {
que.push({nx, ny});
g[nx][ny] = false;
}
}
}
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 0; i < n; ++i) {
cin.ignore(numeric_limits<streamsize>::max(), '\n');
for (int j = 0; j < m; ++j) {
char c;
scanf("%c", &c);
g[i][j] = c == 'W';
}
}
int cnt = 0;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
if (g[i][j]) {
bfs(i, j);
++cnt;
}
}
}
printf("%d\n", cnt);
return 0;
}
评论区