学习目标
前置知识与环境
先阅读 第 12 章对应小节,并确保本机可使用 C++17。首次运行可执行 make doctor;Windows 未安装 Make 时可在仓库根使用 pnpm 命令。
题目
在 2^k × 2^k 棋盘中有一个特殊方格。用 L 形骨牌覆盖其余方格,每块骨牌输出左上参考坐标 (x,y) 与方向编号 c。
输入格式
一行三个整数 k x y,其中 (x,y) 是 1-based 特殊方格坐标。
输出格式
每行输出一块骨牌 x y c。本地固定规范为:先输出当前层中心骨牌,再按左上、右上、左下、右下递归;方向编号沿用原题定义。
数据范围
1 ≤ k ≤ 10,1 ≤ x,y ≤ 2^k。
样例输入
text
2 1 1样例输出
text
3 3 1
2 2 1
1 4 3
4 1 2
4 4 1递归契约卡
| 问题 | 本题答案 |
|---|---|
| 子问题契约 | tile(top,left,size,holeX,holeY) 覆盖区域内除指定洞外的所有格。 |
| Divide | 判断真实洞所在象限,用一块中心骨牌在另外三个象限各制造一个虚拟洞。 |
| Conquer | 对规模严格更小的子问题递归求解;达到最小规模时直接返回。 |
| Combine | 中心骨牌连接四个子问题,之后四个象限彼此独立。 |
| 终止性检查 | 每次递归都缩短区间、减小规模或把下标映射到更短的一层。 |
WARN易错点
洛谷原题使用 Special Judge,合法方案不唯一;本地为了可复现只接受上述固定输出次序和规范方案,判定范围比原题更窄。
复杂度目标
骨牌数为 (4^k-1)/3,时间与输出均为 Θ(4^k),递归栈 O(k)。
测试设计提示
公开测试共 20 组、每组 5 分,总分 100 分。它们覆盖样例、最小规模、边界值、重复值、负数或极值、典型回归输入和适度压力数据。测试只读取标准输出;调试信息请写到标准错误。
运行与评分
powershell
cd labs/chapter-12/exercise/E-12-10-carpet-tromino
make run
# 没有 Make 时,在仓库根执行
pnpm lab:run -- labs/chapter-12/exercise/E-12-10-carpet-tromino
# 作者与 CI 的严格检查
pnpm lab:verify -- labs/chapter-12/exercise/E-12-10-carpet-tromino完成清单
思考与复盘
- 如果把子问题契约改成另一种区间语义,边界和合并会怎样变化?
- 哪个最小反例最容易暴露「洛谷原题使用 Special Judge,合法方案不唯一;本地为了可复现只接受上述固定输出次序和规范方案,判定范围比原题更窄。」?
- 递归调用栈保存了哪些信息?能否安全改写成迭代?
题目来源与课程化说明
核心问题参考 洛谷 P1228。本 Lab 为统一的标准输入/输出环境重新表述题面,并独立编写参考实现与测试数据;不复制第三方题解、代码或隐藏测试。若本地输出合同与原平台不同,以上“输出格式”和“递归契约卡”是本 Lab 的判定依据。