#include<bits/stdc++.h>
using namespace std;
int a[105][105],vis[105][105]={};
int m,n;
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
long long ans=0;
bool check(int x,int y)//检查是否越界
{
return x<=n && x>0 && y<=m && y>0;
}
long long dfs(int x,int y)
{
if(vis[x][y])return 0; //已经访问过不会重复计数
long long s=a[x][y];vis[x][y]++; //累加计算以求大池塘的水量
//并标记以访问
for(int i=0;i<4;i++)
{
int ex=x+dx[i],ey=y+dy[i]; //上下左右的移动
if(a[ex][ey]&&!vis[ex][ey]&check(ex,ey)) //水量不为0,未被访问,未越界
{
s+=dfs(ex,ey); //有相邻且有水的表示是“大池塘”,累计计算水量
}
}
return s;
}
int main()
{
//给定区域
cin>>n>>m;
//写入数据
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
}
}
//dfs
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(a[i][j]&&!vis[i][j])//设置的循环一定不会越界,所以较上面的判断条件少了个check()
{
ans=max(dfs(i,j),ans);
}
}
}
cout<<ans;
return 0;
}
理解:在主函数for循环的作用:“老大”保证将每一个位置都检查到/
dfs相当于小弟,不但会帮助要账(检查合法),而且还会记录谁给谁没给(是否遍历)
但是要在for循环里添加这部分,也就是我们要提醒“老大”要账的时候看账本,给过的就不去找了。
for(int i=1;i<=n;i++)
{
if(vis[i]) continue;
}
#include <bits/stdc++.h>
int n,m;
int a[105][105],vis[105][105];//dfs要有记忆数组,和搜索数组一样大
int dx[4]={0,0,1,-1};//便于上下前后左右移动,注意顺序
int dy[4]={1,-1,0,0};
long long ans=0; //题目中“合成一块大水洼”可能暗示要用答案ans累加。
//初始化
using namespace std;
bool check(int x,int y) //检查是否越界
{
return x<=n&&x>0&&y<=m&&y>0;
}
long long dfs(int x,int y)
{
if(vis[x][y]) return 0; //若这个位置已经看过则跳过
long long s=a[x][y];//记录当前水量
vis[x][y]++;//标记
for(int i=0;i<4;i++)
{
int ex=x+dx[i],ey=y+dy[i]; //上下左右移动
if(a[ex][ey]&&!vis[ex][ey]&&check(ex,ey))//(”并且满足相邻水洼水量大于0“)有水、不越界、没看过则
s+=dfs(ex,ey);//这里的检查条件我觉得是在深层的时候起作用,上面那个是刚进入的时候起作用
}
return s;//返回格子的水量
}
int main()
{
//数据的输入
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>a[i][j];
//dfs
for(int i=1;i<=n;i++) //对于每一个格子都要看过
for(int j=1;j<=m;j++)
{
if(a[i][j]&&!vis[i][j])//
ans=max(ans,dfs(i,j));
}
cout<<ans; //输出水量
return 0;
}