• P1596 [USACO10OCT]Lake Counting S——dfs连通块


    [USACO10OCT]Lake Counting S

    题面翻译

    由于近期的降雨,雨水汇集在农民约翰的田地不同的地方。我们用一个 N × M ( 1 ≤ N ≤ 100 , 1 ≤ M ≤ 100 ) N\times M(1\leq N\leq 100, 1\leq M\leq 100) N×M(1N100,1M100) 的网格图表示。每个网格中有水(W) 或是旱地(.)。一个网格与其周围的八个网格相连,而一组相连的网格视为一个水坑。约翰想弄清楚他的田地已经形成了多少水坑。给出约翰田地的示意图,确定当中有多少水坑。

    输入第 1 1 1 行:两个空格隔开的整数: N N N M M M

    2 2 2 行到第 N + 1 N+1 N+1 行:每行 M M M 个字符,每个字符是 W.,它们表示网格图中的一排。字符之间没有空格。

    输出一行,表示水坑的数量。

    题目描述

    Due to recent rains, water has pooled in various places in Farmer John’s field, which is represented by a rectangle of N x M (1 <= N <= 100; 1 <= M <= 100) squares. Each square contains either water (‘W’) or dry land (‘.’). Farmer John would like to figure out how many ponds have formed in his field. A pond is a connected set of squares with water in them, where a square is considered adjacent to all eight of its neighbors. Given a diagram of Farmer John’s field, determine how many ponds he has.

    输入格式

    Line 1: Two space-separated integers: N and M * Lines 2…N+1: M characters per line representing one row of Farmer John’s field. Each character is either ‘W’ or ‘.’. The characters do not have spaces between them.

    输出格式

    Line 1: The number of ponds in Farmer John’s field.

    样例 #1

    样例输入 #1

    10 12
    W........WW.
    .WWW.....WWW
    ....WW...WW.
    .........WW.
    .........W..
    ..W......W..
    .W.W.....WW.
    W.W.W.....W.
    .W.W......W.
    ..W.......W.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    样例输出 #1

    3
    
    • 1

    提示

    OUTPUT DETAILS: There are three ponds: one in the upper left, one in the lower left, and one along the right side.

    分析

    此题就是求连通块数,用dfs每从一个起点搜索结束后,确定一个连通块,然后ans++;在dfs中,此题是有8个方向可搜索,然后把走过的点标记;

    #include
    
    using namespace std;
    
    int dx[] = {-1, -1, 0, 1, 1, 1, 0, -1};
    int dy[] = {0, 1, 1, 1, 0, -1, -1, -1};
    
    char a[105][105];
    int n, m, ans;
    
    void dfs(int x, int y) {
        for (int i = 0; i < 8; i++) {
            int xx = x + dx[i];
            int yy = y + dy[i];
            if (xx >= 0 && yy >= 0 && xx < n && yy < m && a[xx][yy] == 'W') {
                a[xx][yy] = '.';
                dfs(xx, yy);
            }
        }
    }
    
    int main() {
        cin >> n >> m;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; ++j) {
                cin >> a[i][j];
            }
        }
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; ++j) {
                if (a[i][j] == 'W') {
                    dfs(i, j);
                    ans++;
                }
            }
        }
        cout << ans;
        return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
  • 相关阅读:
    压缩包密码可以删除吗?
    python查找算法_顺序查找
    机器学习python实践——关于ward聚类分层算法的一些个人心得
    简单描述下微信小程序的目录结构
    Arduino Stepper库驱动28BYJ-48步进电机测试程序
    Java延迟队列——DelayQueue
    Linux下的系统编程——认识进程(七)
    【上传图片,文件,视频功能合集】vue-elementul简单实现上传文件,上传图片,上传视频功能【详细注释,简单易用】
    java-net-php-python-jspm生活百汇线上超市系统计算机毕业设计程序
    ExpertPrompting:指导大语言模型成为杰出专家
  • 原文地址:https://blog.csdn.net/weixin_51995229/article/details/127724447