The Lakes
题意:
给一个n * m的矩阵,定义湖的深度为a[i][j]大于0,为0的是陆地,要求湖深度和,求最大的深度和,湖是往上下左右四个方向扩散的。
思路:
简单递归题,递归找湖,找到最大深度和即可。
代码:
/*************************************************************************
> File Name: e.cpp
> Author: Beans
> Mail: 3112748286@qq.com
> Created Time: 2023/5/24 16:58:23
************************************************************************/
#include <iostream>
#include <algorithm>
#include <vector>
#define int long long
#define endl '\n'
using namespace std;
int n, m;
int dx[4] = {
0, 1, 0, -1
};
int dy[4] = {
1, 0, -1, 0
};
int dfs(int x, int y, vector<vector<int>>& g, vector<vector<int>>& vis){
vis[x][y] = 1;
int tem = g[x][y];
for(int i = 0; i < 4; i ++ ){
int tx = x + dx[i], ty = y + dy[i];
if(tx <= 0 || tx > n || ty <= 0 || ty > m || vis[tx][ty] || g[tx][ty] == 0) continue;
tem += dfs(tx, ty, g, vis);
}
return tem;
}
void solve(){
cin >> n >> m;
vector<vector<int>> g(n + 1, vector<int>(m + 1, 0));
for(int i = 1; i <= n; i ++ )
for(int j = 1; j <= m; j ++ )
cin >> g[i][j];
vector<vector<int>> vis(n + 1, vector<int>(m + 1, 0));
int ans = 0;
for(int i = 1; i <= n; i ++ )
for(int j = 1; j <= m; j ++ )
if(!vis[i][j] && g[i][j])
ans = max(ans, dfs(i, j, g, vis));
cout << ans << endl;
}
signed main(){
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
int t = 1;
cin >> t;
while(t -- )
solve();
}