一、先看原题:
二、题目解析:
1、📖 故事背景(先让孩子懂题目)
小 A 有一张地形地图 🗺️,
这张地图是一个M 行 N 列的大棋盘。
每一个小格子里,都有一个数字
数字代表这个地方的海拔高度 ⛰️
🚁 停机坪的建造规则
停机坪是一个3 × 3 的正方形区域:
□ □ □ □ □ □ □ □ □要想在这里建停机坪,必须满足:
1️⃣ 这 9 个格子中
👉最高海拔 - 最低海拔 ≤ H
2️⃣ 在所有可以建停机坪的区域中
👉 找到一个海拔总和最大的
🎯 题目要我们做什么?
👉在整张地图上,找所有 3×3 的小正方形
👉 判断哪些“合格”
👉 在合格的里面,选海拔总和最大的那个
👉 输出这个最大总和
2、🧠 整体思路(先有“大地图”)
我们用一句话总结:
🧩“枚举每一个 3×3 → 统计最大值、最小值、总和 → 判断 → 取最大”
3、🧱 一步一步拆解(非常关键)
✅ 第一步:用二维数组存地图
int a[1010][1010];👉a[i][j]表示:
第i行、第j列的高度
✅ 第二步:枚举每一个 3×3 的左上角
如果地图是M × N:
行最多到:
M - 2列最多到:
N - 2
for (int i = 1; i <= M - 2; i++) { for (int j = 1; j <= N - 2; j++) { // (i, j) 是 3×3 的左上角 } }🧒 可以这样理解:
👉 停机坪不能“出界”
👉 左上角不能贴到最底、最右
✅ 第三步:检查这个 3×3 区域
在一个 3×3 里,我们要记住三件事:
local_max:最大高度local_min:最小高度local_sum:高度总和
int local_max = a[i][j]; int local_min = a[i][j]; int local_sum = 0;🔍 第四步:真正“扫”这个 3×3
for (int x = 0; x < 3; x++) { for (int y = 0; y < 3; y++) { int height = a[i + x][j + y]; local_sum += height; if (height > local_max) local_max = height; if (height < local_min) local_min = height; } }🧒 可以想象成:
小 A 拿着放大镜 🔍
把这 9 个格子一个一个看一遍
✅ 第五步:判断能不能建停机坪
if (local_max - local_min <= H) { if (local_sum > max_sum) { max_sum = local_sum; } }如果起伏不大
✔ 而且总和更大
👉 就更新答案!
4、🧠 完整参考程序
#include <iostream> using namespace std; int a[1010][1010]; int main() { int M, N, H; cin >> M >> N >> H; for (int i = 1; i <= M; i++) { for (int j = 1; j <= N; j++) { cin >> a[i][j]; } } int max_sum = 0; for (int i = 1; i <= M - 2; i++) { for (int j = 1; j <= N - 2; j++) { int local_max = a[i][j]; int local_min = a[i][j]; int local_sum = 0; for (int x = 0; x < 3; x++) { for (int y = 0; y < 3; y++) { int height = a[i + x][j + y]; local_sum += height; if (height > local_max) local_max = height; if (height < local_min) local_min = height; } } if (local_max - local_min <= H) { if (local_sum > max_sum) { max_sum = local_sum; } } } } cout << max_sum; return 0; }5、🧠 这道题在考什么?
🎯 核心能力清单
✅ 二维数组建模
✅ 多层 for 循环
✅ 局部最大 / 最小值
✅ 枚举思想(暴力但合理)
✅ 边界控制(
M-2,N-2)
6、🎒 给小学生的“记忆口诀”
🧠停机坪四步走
1️⃣ 找左上
2️⃣ 扫 3×3
3️⃣ 算最大最小
4️⃣ 合格就更新答案
🎉 结尾总结
🌟 这是一道“看起来难,其实很规矩”的好题
🌟代码耐心 + 条理性是得分的关键