[信息与未来 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;
}读代码重点
先看状态变量,再看核心判断,最后检查边界和输出格式。