• 【洛谷 P1596】[USACO10OCT] Lake Counting S 题解(深度优先搜索)


    [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.


    思路

    使用一个二维字符数组 gnd 存储地图信息。在搜索时,遍历整个地图,对于每个为 ‘W’ 的点,进行 DFS 搜索。在搜索时,将相邻的所有为 ‘W’ 的点都标记为 ‘.’,表示已经搜索过,避免重复搜索。在搜索结束后,计数器 sum 加一,表示搜索到一个湖泊。


    AC代码

    #include 
    #define AUTHOR "HEX9CF"
    using namespace std;
    
    int n, m;
    char gnd[100][100];
    int dfs(int x, int y);
    int sum = 0;
    
    int main()
    {
        ios::sync_with_stdio(false);
        cin >> n >> m;
    
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < m; j++)
            {
                cin >> gnd[i][j];
                // cout << gnd[i][j];
            }
            // cout << endl;
        }
    
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < m; j++)
            {
                if (gnd[i][j] == 'W')
                {
                    dfs(i, j);
                    sum++;
                }
            }
        }
    
        cout << sum << endl;
        return 0;
    }
    
    int dfs(int x, int y)
    {
        for (int i = x - 1; i <= x + 1; i++)
        {
            for (int j = y - 1; j <= y + 1; j++)
            {
                // cout << i << ',' << j << endl;
                if (gnd[i][j] == 'W' && i >= 0 && i <= n - 1 && j >= 0 && j <= m - 1)
                {
                    gnd[i][j] = '.';
                    dfs(i, j);
                }
            }
        }
        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
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
  • 相关阅读:
    基于改进遗传算法的配电网故障定位(matlab代码)
    创建WCF服务
    LeetCode 热题 HOT 100 第七十七天 399. 除法求值 中等题 用python3求解
    开源六轴机械臂myCobot 280末端执行器实用案例解析
    Linux部署Redis Cluster高可用集群(附带集群节点添加删除以及槽位分配操作详解)
    火山引擎DataLeap背后的支持者 - 工作流编排调度系统FlowX
    STM32CubeIDE下载安装
    Apache HBase
    SUID提权教程
    什么是软件?什么是瀑布模型?
  • 原文地址:https://blog.csdn.net/qq_34988204/article/details/133521758