东方博宜OJ 3140 - 避开湖泊(求关注、点赞)

解题思路

  1. 输入处理

    • 读取矩形网格的大小 N 行 M 列,以及被淹没的单元格数 K
    • 接着读取每个被淹没单元格的位置 (R, C)
  2. 数据结构

    • 使用二维数组 grid 表示农场的矩形网格,初始化为所有单元格都是干燥的。
    • 将所有被淹没的单元格标记为淹没状态。
  3. DFS实现

    • 从每个未访问过的淹没单元格开始进行深度优先搜索。
    • 对于每个淹没的单元格,通过递归或者显式的栈来遍历其所有连接的淹没单元格,将它们标记为已访问,并计算湖泊的大小。
  4. 计算最大湖泊

    • 遍历整个网格,对每个未访问的淹没单元格调用DFS,记录并更新最大湖泊的大小。
  5. 输出结果

    • 输出最大湖泊包含的单元格数。

下面是使用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方法能够高效地找出并计算最大的湖泊大小,满足题目要求。

 链接:3140 - 避开湖泊-东方博宜OJ

求点赞、关注、收藏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值