给定一个 N x M (1 <= N <= 100; 1 <= M <= 100) 的区域.每个区域用'W'表示有水,用.表示陆地。 如果一个区域有水且它相邻的区域也有水则同属一个水塘。一个区域最多有八个相邻的区域。根据,给定的地图现在要统计有多少个水塘。
输入
第一行:两个用空格隔开的整数N和M
第2..N+1行:每行M个字符,每个字符为 'W' 或 '.'。
输出
一行:一个整数表示水塘的个数
#include <iostream>
#include <string>
#include <vector>
void visit(std::vector<std::string> &a, int n, int m, int i, int j, char f)
{
std::vector<std::pair<int, int>> list;
a[i][j] = f;
for (int u = -1; u <= 1; u++)
{
for (int v = -1; v <= 1; v++)
{
int x = i + u;
int y = j + v;
if (x < 0 || x >= n || y < 0 || y >= m)
continue;
if (a[x][y] == 'W')
{
a[x][y] = f;
list.push_back({x, y});
}
}
}
for (auto [x, y] : list)
visit(a, n, m, x, y, f);
}
int main()
{
int n, m;
std::cin >> n >> m;
std::vector<std::string> a(n);
for (int i = 0; i < n; i++)
std::cin >> a[i];
int count = 0;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
if (a[i][j] == 'W')
{
count++;
visit(a, n, m, i, j, count + '0');
}
}
}
printf("%d", count);
return 0;
}
$ g++ -Wall -std=c++17 main.cpp
$ cat test.txt
10 12
......W.....
.W....WW....
.WW.........
..WW........
..W........
............
........WW..
........WWW.
...........W
...........W
$ cat test.txt | ./a.out
3