数池塘~!@#¥%…

给定一个 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