1 条题解

  • 0
    @ 2025-4-19 19:27:09

    算法标签:

    dfs

    题解:

    代码功能概述 此代码主要解决的是在二维字符矩阵里的连通块搜索问题。给定一个由字符 X 和 . 组成的二维矩阵,以及矩阵中的起始坐标 (x, y),程序会从该起始点开始运用深度优先搜索(DFS)算法,计算与起始点相连通的 X 块周围 . 的数量。

    解题思路 输入处理:首先读取矩阵的行数 m、列数 n 以及起始坐标 (x, y),接着把矩阵数据存入二维字符数组 a 中。

    深度优先搜索:从起始坐标 (x, y) 开始进行深度优先搜索。在搜索过程中,对每个位置的上下左右四个方向进行检查,若遇到 . 则计数加 1。同时,对该位置的 8 个方向进行递归搜索,持续扩展连通块。

    标记访问:利用 book 数组标记每个位置是否已被访问,防止重复访问。

    输出结果:最终输出与起始点相连通的 X 块周围 . 的总数。

    #include<algorithm>
    #include<iostream>
    #include<string.h>
    using namespace std;
    const  int N = 1e2;
    char a[N][N];
    int m,n,x,y;
    int book[N][N];
    int nxt[8][2] = {{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}};
    int dfs(int i,int j)
    {
        book[i][j] = 1;//每一个元素只访问一次
        int sum = 0;
        for(int k = 0; k < 8; k+=2){//枚举每一个X上下左右四个方向的点点
            if(a[i+nxt[k][0]][j+nxt[k][1]]=='.'){
                sum++;
            }
        }
        for(int k = 0; k < 8; ++k){//搜索连通块
            int tx = nxt[k][0]+i;
            int ty = nxt[k][1]+j;
            if(book[tx][ty]==1||a[tx][ty]=='.')//边界条件,点点就是边界
                continue;
            sum = sum + dfs(tx,ty);
        }
        return sum;
    }
    
    
    int main()
    {
        while(cin>>m>>n>>x>>y&&m!=0){
            memset(book,0,sizeof book);
            memset(a,'.',sizeof a);
            for(int i = 1; i <= m; ++i){
                for(int j = 1; j <= n; ++j){
                    cin>>a[i][j];
                }
            }
            int ans = dfs(x,y);
            cout<<ans<<endl;
        }
        return 0;
    }
    
    • 1

    信息

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