C++ 深度优先搜索 (DFS) 求解最大连通块大小
这是一段使用深度优先搜索 (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);
}
原文地址: https://www.cveoy.top/t/topic/oSJu 著作权归作者所有。请勿转载和采集!