博客
关于我
【SSL 2324&洛谷P1451】细胞问题【DFS】
阅读量:298 次
发布时间:2019-03-03

本文共 1442 字,大约阅读时间需要 4 分钟。

DFS 是解决这道题的好方法,因为它简单且适合处理这种寻找连通区域的问题。我们可以通过遍历矩阵,找到不是 '0' 的点,然后从这些点开始进行 DFS,检查四个方向(上、下、左、右)是否有相连的非 '0' 数字。如果有,就将这个点标记为 '0',并继续深入查找。每次启动 DFS,就意味着发现了一个新的细胞,因此 ans 会加 1。

步骤说明

  • 读取输入:首先读取总行数和总列数,然后读取接下来的 m 行,将每一行的字符存储在二维数组 a 中。
  • 初始化:定义 dx 和 dy 数组,分别表示上下左右四个方向的移动。
  • DFS 函数:这个函数负责从给定的位置 (x, y) 开始,检查四个方向的邻居。如果邻居在矩阵范围内且不是 '0',就将它标记为 '0' 并递归调用 DFS。
  • 遍历矩阵:对于矩阵中的每一个位置,如果它不是 '0',启动一次 DFS,并将 ans 加 1。
  • 输出结果:最后输出 ans 的值。
  • 代码实现

    #include 
    #include
    using namespace std;
    int n, m, ans;
    char a[105][105];
    int dx[5] = {0, -1, 1, 0, 0};
    int dy[5] = {0, 0, 0, -1, 1};
    void dfs(int x, int y) {
    for (int i = 1; i <= 4; ++i) {
    int xx = x + dx[i];
    int yy = y + dy[i];
    if (xx > 0 && xx <= n && yy > 0 && yy <= m && a[xx][yy] != '0') {
    a[xx][yy] = '0';
    dfs(xx, yy);
    }
    }
    }
    int main() {
    cin >> n >> m;
    for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= m; ++j) {
    cin >> a[i][j];
    }
    }
    for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= m; ++j) {
    if (a[i][j] != '0') {
    dfs(i, j);
    ans++;
    }
    }
    }
    cout << ans << endl;
    return 0;
    }

    代码解释

    • 读取输入:使用 cin 读取输入数据,并将每一行的字符存储在二维数组 a 中。
    • DFS 函数:定义了一个递归函数 dfs,用于从给定位置开始检查四个方向的邻居。如果邻居在矩阵范围内且不是 '0',则标记它并继续递归。
    • 遍历矩阵:在主函数中,遍历矩阵中的每一个位置。如果位置的值不是 '0',启动一次 DFS,并将 ans 加 1。
    • 输出结果:最后输出 ans 的值,即矩阵中的细胞个数。

    这种方法通过封路(标记为 '0')确保每个细胞只被计算一次,能够高效地解决问题。

    转载地址:http://fdim.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现使用数组实现约瑟夫环(附完整源码)
    查看>>
    Objective-C实现使用管道重定向进程输入输出(附完整源码)
    查看>>
    Objective-C实现倒计时(附完整源码)
    查看>>
    Objective-C实现借记款项功能(附完整源码)
    查看>>
    Objective-C实现关系矩阵A和B的乘积(附完整源码)
    查看>>
    Objective-C实现关系矩阵乘法(附完整源码)
    查看>>
    Objective-C实现关系矩阵乘法(附完整源码)
    查看>>
    Objective-C实现关键字移位字母表密码算法(附完整源码)
    查看>>
    Objective-C实现内存映射文件(附完整源码)
    查看>>
    Objective-C实现内存泄露检查(附完整源码)
    查看>>
    Objective-C实现内格尔·施雷肯伯格算法(附完整源码)
    查看>>
    Objective-C实现几何级数的总和算法 (附完整源码)
    查看>>
    Objective-C实现凸多边形的凸包问题算法(附完整源码)
    查看>>
    Objective-C实现分块查找算法(附完整源码)
    查看>>
    Objective-C实现分块查找算法(附完整源码)
    查看>>
    Objective-C实现分水岭算法(附完整源码)
    查看>>
    Objective-C实现分解质因数(附完整源码)
    查看>>
    Objective-C实现切换数字的符号switchSign算法(附完整源码)
    查看>>
    Objective-C实现列主元高斯消去法(附完整源码)
    查看>>
    Objective-C实现创建多级目录(附完整源码)
    查看>>