解题思路
-
输入处理:
- 读取矩形网格的大小
N
行M
列,以及被淹没的单元格数K
。 - 接着读取每个被淹没单元格的位置
(R, C)
。
- 读取矩形网格的大小
-
数据结构:
- 使用二维数组
grid
表示农场的矩形网格,初始化为所有单元格都是干燥的。 - 将所有被淹没的单元格标记为淹没状态。
- 使用二维数组
-
DFS实现:
- 从每个未访问过的淹没单元格开始进行深度优先搜索。
- 对于每个淹没的单元格,通过递归或者显式的栈来遍历其所有连接的淹没单元格,将它们标记为已访问,并计算湖泊的大小。
-
计算最大湖泊:
- 遍历整个网格,对每个未访问的淹没单元格调用DFS,记录并更新最大湖泊的大小。
-
输出结果:
- 输出最大湖泊包含的单元格数。
下面是使用C++语言实现的代码:
#include <iostream> #include <vector> using namespace std; const int MAXN = 105; int N, M, K; bool visited[MAXN][MAXN]; int grid[MAXN][MAXN]; int dr[] = {-1, 1, 0, 0}; // directions: up, down, left, right int dc[] = {0, 0, -1, 1}; bool isValid(int r, int c) { return (r >= 1 && r <= N && c >= 1 && c <= M); } void dfs(int r, int c, int & size) { visited[r][c] = true; size++; for (int d = 0; d < 4; ++d) { int nr = r + dr[d]; int nc = c + dc[d]; if (isValid(nr, nc) && !visited[nr][nc] && grid[nr][nc] == 1) { dfs(nr, nc, size); } } } int main() { cin >> N >> M >> K; for (int i = 0; i < K; ++i) { int R, C; cin >> R >> C; grid[R][C] = 1; // mark as flooded } int maxLakeSize = 0; for (int r = 1; r <= N; ++r) { for (int c = 1; c <= M; ++c) { if (grid[r][c] == 1 && !visited[r][c]) { int currentSize = 0; dfs(r, c, currentSize); maxLakeSize = max(maxLakeSize, currentSize); } } } cout << maxLakeSize << endl; return 0; }
代码解析
isValid(r, c)
函数用于检查坐标(r, c)
是否在有效范围内。dfs(r, c, size)
函数实现深度优先搜索,标记并计算以(r, c)
为起点的湖泊大小。- 主程序中使用两重循环遍历整个网格,对每个未访问过的淹没单元格调用
dfs()
函数,更新最大湖泊的大小。 - 最后输出最大湖泊包含的单元格数。
这样,通过DFS方法能够高效地找出并计算最大的湖泊大小,满足题目要求。
求点赞、关注、收藏