返回题解分享
讨论 / 题解分享/ 帖子详情

全球变暖(编程题) - 题解

BFS



1. 读取包含陆地('#')和大海('.')的地图数据。
2. 对地图进行遍历,对每个未被搜索过的陆地进行广度优先搜索(BFS),统计搜索到的陆地单元格数(total)和与大海相连的边界单元格数(bound)。
* 3. 判断一个岛屿是否被完全淹没的标准是:搜索到的陆地单元格数等于与大海相连的边界单元格数。若满足此条件,计数器cnt加一。

#include <bits/stdc++.h>

#define x first
#define y second

using namespace std;

typedef pair<int, int> PII;

const int N = 1010;

int n;
char g[N][N]; // 二维数组 g 存储地图,'#' 表示陆地,'.' 表示大海
bool st[N][N]; // 记录每个格子是否被搜索过,初始均为 false

PII q[N * N]; // 定义一个队列用于广度优先搜索

int dx[4] = {-1, 0, 1, 0}; // 四个方向的水平偏移量
int dy[4] = {0, 1, 0, -1}; // 四个方向的垂直偏移量


// 广度优先搜索函数,参数:搜索起点坐标(sx, sy),累计搜索到的陆地单元格数(total),与大海相连的边界单元格数(bound)
void bfs(int sx, int sy, int &total, int &bound) {
    int hh = 0, tt = 0; // hh:队首指针,tt:队尾指针
    q[0] = {sx, sy}; // 将起点加入队列
    st[sx][sy] = true; // 标记起点已被搜索过

    while (hh <= tt) { // 当队列不为空时
        PII t = q[hh++]; // 弹出队首元素
        total++; // 增加已搜索到的陆地单元格数

        bool is_bound = false; // 标记当前格子是否与大海相连

        // 遍历当前格子的四个方向
        for (int i = 0; i < 4; i++) {
            int x = t.x + dx[i], y = t.y + dy[i]; // 计算相邻格子坐标

            // 检查是否越界
            if (x < 0 || x >= n || y < 0 || y >= n) continue;

            // 如果相邻格子已被搜索过,跳过本次循环
            if (st[x][y]) continue;

            // 检查相邻格子类型
            if (g[x][y] == '.') {
                is_bound = true; // 标记当前格子与大海相连
                continue;
            }

            // 如果相邻格子是未搜索过的陆地,将其加入队列并标记为已搜索
            q[++tt] = {x, y};
            st[x][y] = true;
        }

        // 如果当前格子与大海相连,增加边界单元格数
        if (is_bound) bound++;
    }
}

int main() {
    scanf("%d", &n); // 输入地图大小

    // 读取地图数据
    for (int i = 0; i < n; i++) scanf("%s", g[i]);

    int cnt = 0; // 初始化被淹没岛屿个数

    // 遍历地图,对每个未被搜索过的陆地进行广度优先搜索
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++) {
            if (!st[i][j] && g[i][j] == '#') { // 检查是否为未搜索过的陆地
                int total = 0, bound = 0; // 初始化单元值和边界数量
                bfs(i, j, total, bound); // 对当前陆地进行广度优先搜索

                // 如果搜索到的陆地单元格数等于与大海相连的边界单元格数,说明该岛屿被完全淹没,计数器加一
                if (total == bound) cnt++;
            }
        }

    printf("%d\n", cnt); // 输出被淹没岛屿个数

    return 0;
}
0 回复 0 转发 2 喜欢 0 阅读
回复 (0)
默认 最新
暂无回复,快来抢沙发!