蓝桥杯 10. 全球变暖

全球变暖

原题目链接

题目描述

你有一张某海域 N x N 像素的照片:

  • . 表示海洋
  • # 表示陆地

例如如下所示:

in 复制代码
.......
.##....
.##....
....##.
..####.
...###.
.......

在照片中,"上下左右"四个方向上连在一起的一片陆地组成一座岛屿。例如上图中有 2 座岛屿。

由于全球变暖导致海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围将会被海水淹没。具体来说:

  • 如果一块陆地像素与海洋相邻(上下左右方向中有 .),那么它会被淹没。

例如上述海域未来会变成:

in 复制代码
.......
.......
.......
.......
....#..
.......
.......

请你计算:根据科学家的预测,照片中有多少岛屿会被完全淹没(即该岛屿的所有陆地像素都会被淹没)。


输入描述

  • 第一行包含一个整数 N(1 ≤ N ≤ 1000),表示海域为 N x N 像素。
  • 接下来 N 行,每行 N 个字符,表示当前海域图像。
  • 每个字符为 .(海洋)或 #(陆地)。
  • 保证第 1 行、第 1 列、第 N 行、第 N 列的所有像素都是海洋。

输出描述

  • 输出一个整数,表示未来会被完全淹没的岛屿数量。

输入示例

in 复制代码
7
.......
.##....
.##....
....##.
..####.
...###.
.......

输出示例

out 复制代码
1

c++代码

cpp 复制代码
#include<bits/stdc++.h>

using namespace std;

struct node {
    int sym = 0, index = 0;
};

vector<vector<node>> arr;
string str;
int ans = 0, n;
unordered_set<int> result;

void dfs(int i, int j, int index) {
    if (i < 0 || i >= n || j < 0 || j >= n || arr[i][j].sym == 0 || arr[i][j].index != 0) return;
    arr[i][j].index = index;
    dfs(i + 1, j, index), dfs(i - 1, j, index), dfs(i, j + 1, index), dfs(i, j - 1, index);
}

bool check(int i, int j) {
    if (i - 1 >= 0 && arr[i - 1][j].sym == 0) return true;
    if (i + 1 < n && arr[i + 1][j].sym == 0) return true;
    if (j - 1 >= 0 && arr[i][j - 1].sym == 0) return true;
    if (j + 1 < n && arr[i][j + 1].sym == 0) return true;
    return false;
}

int main() {
    std::ios::sync_with_stdio(false), std::cin.tie(nullptr), std::cout.tie(nullptr);
    cin >> n;
    arr = vector<vector<node>>(n, vector<node>(n));
    for (int i = 0; i < n; i++) {
        cin >> str;
        for (int j = 0; j < n; j++) {
            if (str[j] == '.') arr[i][j].sym = 0;
            else arr[i][j].sym = 1;
        }
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (arr[i][j].sym == 1 && arr[i][j].index == 0) {
                ans++;
                dfs(i, j, ans);
            }
        }
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (arr[i][j].sym == 1) {
                if (check(i, j)) arr[i][j].index = 0;
                if (arr[i][j].index != 0 && result.find(arr[i][j].index) == result.end()) result.insert(arr[i][j].index);
            }
        }
    }
    cout << ans - result.size();
    return 0;
}//by wqs
相关推荐
坤坤子吖4 分钟前
Linux网络编程:TCP服务器的多进程与多线程实现
linux·服务器·开发语言·网络·c++·笔记·学习
一晌小贪欢40 分钟前
Python基础:第 09 篇 · while 循环:重复直到不满足
开发语言·c++·python·数据可视化·面向对象·python办公
zh_xuan1 小时前
LeeCode 496. 下一个更大元素I
数据结构·算法·栈·单调栈
机 _ 长1 小时前
05 智算运维|8 张卡怎么才算「捆成一张」:NCCL 实测与拓扑
运维·人工智能·算法·智算运维
xiaoye-duck1 小时前
《C++ 项目:手写大模型接入 SDK》LLMManager架构设计与实现
开发语言·网络·c++·语言模型
一条大祥脚2 小时前
CuTe 与 CuTe DSL:从 C++ 模板元编程到 Python DSL 的 GPU 编程演进
开发语言·c++·python·cutlass·cute·cute dsl
·present·2 小时前
CSAPP(lecture 13_02 Linking)
c语言·c++
早起CaiCai2 小时前
【2023-01 OM】利用深度学习算法融合异质观测实现海洋场降尺度
人工智能·深度学习·算法
梦里寻码2 小时前
我用 NestJS + Vue3 写了一套完整的研发管理系统(58 表 / 229 API / 130 项断言,全开源
前端·后端·算法
旖旎夜光2 小时前
【C++ 基础入门】C++ 多态(上):虚函数、重写、override/final 与抽象类
开发语言·c++·笔记·学习