这是一段使用深度优先搜索 (DFS) 求解最大连通块大小的 C++ 代码。

首先,代码读入了地图的长和宽,以及地图本身。接着,代码双重循环遍历地图,对于每个值为 '1' 的点,进行 DFS 搜索。

在 DFS 函数内部,首先将计数器 cnt 加 1,表示当前搜索到的连通块大小加 1。然后,将当前搜索到的点的值改为 '!',表示已被搜索过。接着,向四个方向递归搜索,只有在该方向上的点的值为 '1' 时才会继续搜索。这样可以避免重复搜索已经搜索过的点。

最后,在双重循环中,每次更新最大连通块大小 maxc,最终输出 maxc 即可。

需要注意的是,代码中有一个错误:在搜索点的右边时,应该判断 y+1 是否小于 n(即地图宽度),而不是判断 x-1 是否小于 n。正确的代码应该是:

if(y+1 < n && Map[x][y+1] == '1')
  dfs(x, y+1);

以下是完整的代码:

#include <bits/stdc++.h>
using namespace std;

int m, n, cnt = 0, maxc = 0b1 << 31;
char Map[128][128] = {};

void dfs(int x, int y);
int main(){
  scanf("%d %d", &m, &n);
  
  for(int i = 0; i < m; ++i)
    for(int j = 0; j < n; ++j)
      cin >> Map[i][j];
  
  for(int i = 0; i < m; ++i)
    for(int j = 0; j < n; ++j)
      if(Map[i][j] == '1'){
        cnt = 0;
        dfs(i, j);
        maxc = max(cnt, maxc);
      }
  
  cout << maxc;
  return 0;
}

void dfs(int x, int y){
  ++cnt;
  Map[x][y] = '!';
  if(x-1 >= 0 && Map[x-1][y] == '1')
    dfs(x-1, y);
  if(x+1 < m && Map[x+1][y] == '1')
    dfs(x+1, y);
  if(y-1 >= 0 && Map[x][y-1] == '1')
    dfs(x, y-1);
  if(y+1 < n && Map[x][y+1] == '1') // 修正后的代码
    dfs(x, y+1);
}
C++ 深度优先搜索 (DFS) 求解最大连通块大小

原文地址: https://www.cveoy.top/t/topic/oSJu 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录