题解(要用dfs哦)
2026-06-25 20:29:03
发布于:浙江
7阅读
0回复
0点赞
首先,这题要用dfs,否则我也不会做
dfs代码:
int dx[] = {1, -1, 0, 0}, dy[] = {0, 0, -1, 1};
void dfs(int x, int y) {
if(x < 0 || x >= n || y < 0 || y >= m || vis[x][y] || adj[x][y] == 0) {
return;
}
vis[x][y] = true;
sum++;
for(int i = 0; i < 4; i++) {
int nx = x + dx[i], ny = y + dy[i];
dfs(nx, ny);
}
}
这段代码大家应该都知道,接下来,只要加上一段输入数组和找最大值就好了
完整代码:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int n, m;
vector<vector<int>> adj;
vector<vector<bool>> vis;
int dx[] = {1, -1, 0, 0}, dy[] = {0, 0, -1, 1};
int sum = 0;
void dfs(int x, int y) {
if(x < 0 || x >= n || y < 0 || y >= m || vis[x][y] || adj[x][y] == 0) {//判断是否超出边界或不是白格或已被访问过
return;//退出
}
vis[x][y] = true;//标记这个点
sum++;//连通块大小加1
for(int i = 0; i < 4; i++) {
int nx = x + dx[i], ny = y + dy[i];
dfs(nx, ny);//递归
}
}
int main() {
cin >> n >> m;
adj.assign(n, vector<int>(m));
vis.assign(n, vector<bool>(m, 0));//设置数组
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
cin >> adj[i][j];//输入数组
}
}
int max_ = 0;
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
if(adj[i][j] != 0 && !vis[i][j]) {//没被访问过而且不是白格
dfs(i, j);//dfs
max_ = max(max_, sum);//判断最大值
sum = 0;//sum变0
}
}
}
cout << max_;//输出max_
}
这里空空如也







有帮助,赞一个