学习目标与前置知识
- 明确搜索状态、合法选择与终止条件,完成能通过本地判题的 C++17 解答。
- 用边界输入解释本题的常见错误,说明剪枝或最短距离为何正确。
- 前置:本章相关知识,C++ 函数、容器、递归,以及题目所用的队列或位运算。
题目描述
给定一个9×9数独盘面,用数字1到9填满所有空格,使每一行、每一列和每个3×3宫都恰好包含1到9。输入中的数字不得修改,原题保证恰好有一个解。
本 Lab 将原题函数接口适配为标准输入/输出。枚举题的读写框架负责按本页约定排序,核心返回值的含义与原题一致。
输入格式
9行,每行9个字符,.表示空格,1到9表示给定数字。
输出格式
输出解出的9行棋盘,每行9个连续数字,不加空格或答案数量。
数据范围
固定9×9,字符为.或1到9,保证恰有一个解;不包含多解或无解输入。
样例输入
text
53..7....
6..195...
.98....6.
8...6...3
4..8.3..1
7...2...6
.6....28.
...419..5
....8..79样例输出
text
534678912
672195348
198342567
859761423
426853791
713924856
961537284
287419635
345286179状态与边界
行、列、宫的位掩码记录已使用数字;从空格中选候选数最少的一格进行分支。
回溯要恢复三个掩码和盘面;本题找到一个解就能结束,这依赖唯一解的题目保证。
复杂度目标
设空格数为E,最坏 O(81 * 9^E),约束与最少候选剪枝可显著减少分支;辅助空间 O(81+E)。
编写与测试
修改 student/main.cpp 中的 solve,保留读写框架。标准输出只保留答案,调试信息写入标准错误。测试清单和分值以 tests/cases.json 为准,总分 100 分,输入均符合本页约定。
在仓库根目录执行:
powershell
pnpm lab:run -- labs/chapter-15/exercise/E-15-17-sudoku-solver
pnpm lab:score -- labs/chapter-15/exercise/E-15-17-sudoku-solver进入本 Lab 目录后也可以运行 make run。作者与 CI 严格核验:
powershell
pnpm lab:verify -- labs/chapter-15/exercise/E-15-17-sudoku-solver完成清单
思考与复盘
- 哪些信息必须随当前路径恢复,哪些信息可以保留?
- 去掉本题的一条约束或剪枝,会影响正确性还是只影响效率?请用具体输入说明。
- 输入达到上限时,时间、递归深度和输出大小分别如何增长?
题目来源与课程化说明
来源:力扣 37 解数独。题面按课程环境重新表述,参考实现和测试独立编写,不复制第三方题解或隐藏测试。完整参考代码位于 solution/main.cpp。