1 条题解

  • 0
    @ 2025-4-15 11:59:04

    题意分析

    给定一个 (N × M) 的方格矩阵表示农夫约翰的田地,矩阵中的 'W' 表示积水,'.' 表示旱地。若若干个 'W' 方格相连(包括八个方向相邻),则它们构成一个池塘。需要计算矩阵中池塘的数量。

    解题思路

    使用深度优先搜索(DFS)来遍历矩阵。每当遇到一个 'W' 方格时,就从该方格开始进行 DFS,将与该方格相连的所有 'W' 方格标记为 '.',表示这些方格已被访问过,这样就找到了一个池塘。重复这个过程,直到遍历完整个矩阵,记录找到的池塘数量。

    分析

    1.本题可以将矩阵看作一个图,每个方格是图中的一个节点,相邻的方格之间有边相连。问题就转化为求图中连通分量的数量。

    2.DFS 是一种适合解决连通分量问题的算法,它可以递归地访问与起始节点相连的所有节点。

    实现步骤

    1.读取输入的 N 和 M,以及矩阵的每个方格字符。

    2.遍历矩阵,当遇到 'W' 方格时,调用 DFS 函数。

    3.在 DFS 函数中,将当前 'W' 方格标记为 '.',并递归地访问其八个相邻方格中为 'W' 的方格。

    4.每完成一次 DFS,池塘数量加 1。

    5.输出池塘的总数。

    代码实现

    #include<stdio.h>
    #include<iostream>
    using namespace std;
    
    const int N_Max=100,M_Max=100;
    char Lake[N_Max][M_Max];
    int N,M;
    
    void dfs(int n,int m)
    {
        if(Lake[n][m]=='.')
            return;
        Lake[n][m]='.';
        for(int i=-1;i!=2;i++)
            for(int j=-1;j!=2;j++){
                if( 0<=n+i&&n+i<N && 0<=m+j&&m+j<M && Lake[n+i][m+j]=='W')
                    dfs(n+i,m+j);
            }
        
        return ;
    }
    
    int main()
    {
        cin>>N>>M;
        for(int i=0;i!=N;i++)
            for(int j=0;j!=M;j++)
            {
                cin>>Lake[i][j];
            }
        int res=0;
        for(int i=0;i!=N;i++)
            for(int j=0;j!=M;j++){
                if(Lake[i][j]=='W'){
                    dfs(i,j);
                    res++;
                }
            }
        printf("%d\n",res);
        return 0;
    }
    

    代码说明:

    1.Lake 数组用于存储矩阵信息。

    2.dfs 函数实现了深度优先搜索,将当前 'W' 方格标记为 '.',并递归访问其相邻的 'W' 方格。

    3.在 main 函数中,读取输入,遍历矩阵,遇到 'W' 方格时调用 dfs 函数,并记录池塘数量,最后输出结果。

    • 1

    信息

    ID
    1387
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    4
    已通过
    1
    上传者