B4530

[信息与未来 2026] 快递无人机

反过来找外部区域,比猜圆心半径更稳。

一、先回答问题

结论

从地图四周出发 Flood Fill。星号是墙,外部走不到的包裹就是圆内包裹。

课堂安排

先抓住模型,再用一个小样例手推,最后把判断写成稳定的 C++14 代码。

二、核心观察

错误想法

不要按几何圆去算距离,输入只是字符地图。

正确模型

边界外能走到的是外部,剩下被星号围住的是内部。

三、互动演示

四、自己选答案

问题 1:这题最关键的状态是什么?

五、手推结果

格子处理
*墙,不能穿过
边界上的非 *外部起点
未被外部染到的 o答案 +1

六、C++14 参考代码

#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, m;
    cin >> n >> m;
    vector<string> a(n);
    for (int i = 0; i < n; i++) cin >> a[i];

    vector<vector<int>> vis(n, vector<int>(m, 0));
    queue<pair<int, int>> q;

    auto add = [&](int x, int y) {
        if (x < 0 || x >= n || y < 0 || y >= m) return;
        if (vis[x][y] || a[x][y] == '*') return;
        vis[x][y] = 1;
        q.push({x, y});
    };

    for (int i = 0; i < n; i++) {
        add(i, 0);
        add(i, m - 1);
    }
    for (int j = 0; j < m; j++) {
        add(0, j);
        add(n - 1, j);
    }

    int dx[4] = {1, -1, 0, 0};
    int dy[4] = {0, 0, 1, -1};
    while (!q.empty()) {
        auto [x, y] = q.front();
        q.pop();
        for (int k = 0; k < 4; k++) {
            add(x + dx[k], y + dy[k]);
        }
    }

    int ans = 0;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (a[i][j] == 'o' && !vis[i][j]) ans++;
        }
    }
    cout << ans << '\n';
    return 0;
}
读代码重点

先看状态变量,再看核心判断,最后检查边界和输出格式。