HJ158 挡住洪水

  • 题目
  • 题解(22)
  • 讨论(12)
  • 排行

简单 通过率:30.19% 时间限制:1秒 空间限制:256M

知识点广度优先搜索(BFS)

校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。

描述

吴铭市近日洪水肆虐,洪水从地图外部渗入。市政部门在若干方格上砌起围墙,用 `*` 表示。若某片空地区域不与地图边界四联通(上下左右方向),则不会被洪水淹没,视为安全空地。

地图用大小为 x×yx×y 的字符矩阵描述:`'*'` 表示围墙,`'0'` 表示空地。所有相互四联通的 `'0'` 构成一个区域。请统计所有安全空地格子的数量之和(即所有不与边界四联通的 `'0'` 的总数)。

输入描述:

第一行输入两个整数 x,y(1≦x,y≦500)x,y(1≦x,y≦500)。

接下来 xx 行,每行 yy 个字符,组成围墙建设图,仅含 `'*'` 与 `'0'`。

输出描述:

输出一个整数,表示所有安全空地格子的总数。

示例1

输入:

复制代码
2 2
**
**

复制输出:

复制代码
0
cpp 复制代码
#include <iostream>
#include <vector>
#include <string>
#include <queue>

using namespace std;

int n, m;
vector<string> grid;
int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};

void bfs(int start_x, int start_y) {
    if (grid[start_x][start_y] != '0') {
        return;
    }

    queue<pair<int, int>> q;
    q.push({start_x, start_y});
    grid[start_x][start_y] = '#';

    while (!q.empty()) {
        pair<int, int> curr = q.front();
        q.pop();

        for (int i = 0; i < 4; ++i) {
            int nx = curr.first + dx[i];
            int ny = curr.second + dy[i];

            if (nx >= 0 && nx < n && ny >= 0 && ny < m && grid[nx][ny] == '0') {
                grid[nx][ny] = '#';
                q.push({nx, ny});
            }
        }
    }
}

int main() {
    cin >> n >> m;
    grid.resize(n);
    for (int i = 0; i < n; ++i) {
        cin >> grid[i];
    }

    // 1. 从边界开始,淹没所有不安全的 '0' 区域
    for (int j = 0; j < m; ++j) {
        if (grid[0][j] == '0') bfs(0, j);
        if (n > 1 && grid[n - 1][j] == '0') bfs(n - 1, j);
    }
    for (int i = 1; i < n - 1; ++i) {
        if (grid[i][0] == '0') bfs(i, 0);
        if (m > 1 && grid[i][m - 1] == '0') bfs(i, m - 1);
    }

    // 2. 统计图中剩余的 '0' 单元格总数
    int safe_cells = 0;
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            if (grid[i][j] == '0') {
                safe_cells++;
            }
        }
    }

    cout << safe_cells << endl;

    return 0;
}
相关推荐
梓䈑2 小时前
【CMake】动静态库的安装 和 使用
c++·cmake
Wect2 小时前
LeetCode 190. 颠倒二进制位:两种解法详解
前端·算法·typescript
刘永鑫Adam2 小时前
BiB | 蒋超实验室开发 Kun-peng(鲲鹏):实现可扩展且准确的泛域宏基因组分类
人工智能·算法·机器学习·分类·数据挖掘
Yupureki2 小时前
《Linux网络编程》1.网络基础
linux·运维·服务器·c语言·网络·c++
ltl2 小时前
SM3 vs SHA-256:两个哈希函数的设计哲学与性能实测
后端·算法
知星小度S2 小时前
算法训练之递归(一)
数据结构·算法
十五年专注C++开发2 小时前
银河麒麟V10系统安装vcpkg的方法
c++·cmake·vcpkg
未来之窗软件服务2 小时前
SenseVoicecpp ggml-webgpu大模型[AI人工智能(七十五)]—东方仙盟
c++·人工智能·算法·仙盟创梦ide·东方仙盟
寂柒2 小时前
C++——堆
开发语言·c++