数独解题助手
这个技能做什么、不做什么
- 做:标准 9×9 数独。
- 求解:程序精确求解,同时判断无解(题面冲突,或无冲突但穷举无解)、唯一解、多解(给出两个不同的解和相差的格子)。
- 分步讲解:按人类解法从易到难推进,每一步说明用了什么技巧、为什么。
- 难度评估:按用到的最难技巧分五档。
- 提示:只给下一步(或下几步),不剧透整盘。
- 核对:用户填到一半,找出填错的格子。
- 不做:不做图片/拍照识别(OCR),请用户把题面打成文字;不支持 6×6、16×16、杀手数独、对角线数独等变体。
- 答案一律来自脚本输出,不要自己心算或猜数独答案。模型心算数独很容易出错。
输入格式
81 个格子,从左到右、从上到下。已知数写 1-9,空格写 0 或 .(_ * ? x 也行)。空格、换行、|、-、+、逗号等分隔符会被忽略,全角数字也能读。下面两种写法等价:
530070000600195000098000060800060003400803001700020006060000280000419005000080079
5 3 . | . 7 . | . . .
6 . . | 1 9 5 | . . .
. 9 8 | . . . | . 6 .
...(共 9 行)
读到的格数不是 81 时,脚本会报出实际格数,请用户逐行核对。
使用流程
- 把用户的题面原样交给脚本(多行题面用
--file,或通过标准输入):
`` python {baseDir}/scripts/sudoku.py explain --puzzle "530070000600195000098000060800060003400803001700020006060000280000419005000080079" python {baseDir}/scripts/sudoku.py explain --file puzzle.txt ``
- 按用户意图选模式:
| 模式 | 用途 | |---|---| | solve | 只要答案:状态 + 难度 + 答案盘面 | | explain | 答案 + 全部分步讲解(默认推荐) | | hint --n 1 | 只给下一步,不给答案;--n 3 给三步 | | grade | 只评难度,列出各技巧用了几次 | | check --board "..." | 核对用户当前盘面(--board 是用户填到一半的 81 格) |
加 --json 输出结构化结果(status / solution / steps / difficulty)。
- 把脚本输出原样给用户,再用一两句话点出关键点(例如「这题卡点在第 23 步的 X-Wing」)。讲解步骤很多时,可以先给答案和难度,再问用户要不要看全部步骤,或只看某一段。
结果状态
| status | 含义 | 怎么跟用户说 | |---|---|---| | unique | 唯一解 | 正常给答案和讲解 | | multiple | 至少两个解 | 说明不是合格数独,给出两个解及相差格子;多半是漏抄了已知数 | | invalid | 已知数直接冲突 | 指出哪一行/列/宫重复;多半是抄错 | | no_solution | 没有直接冲突但穷举无解 | 给出推理中出现矛盾的位置;多半是抄错 |
讲解口径
- 格子记为
R行C列(R3C5 = 第 3 行第 5 列);宫按从左到右、从上到下编 1-9。 - 技巧顺序与难度档位:
| 档位 | 技巧 | |---|---| | 简单 | 宫内隐性唯一、行列隐性唯一、唯一候选数 | | 中等 | 区块摒除(宫→行列 pointing、行列→宫 claiming) | | 困难 | 显性数对、隐性数对、显性三数组、隐性三数组 | | 专家 | X-Wing、XY-Wing、剑鱼 | | 骨灰 | 以上全部卡住,需要试数 |
- 每一步都优先用最简单的技巧;难度 = 用到的最难技巧所在档位,另给一个参考评分。
- 试数:选候选最少的格子,把错误候选逐个回溯验证为无解后再填正确值——所以讲解里的试数是「已验证的结论」,不是瞎猜。
- 自测会逐步核对:讲解里每一次填数都等于唯一解,每一次删除的候选都不是正确答案。
样例与自测
assets/puzzles.txt:简单、中等、困难、专家(X-Wing、XY-Wing)、骨灰(AI Escargot、Inkala 2012)、两种无解、一个多解,共 10 道。- 自测:
`` python {baseDir}/scripts/selftest.py ``
覆盖全部样例的状态和难度、答案独立校验、讲解逐步一致性、40 道随机极小题、输入容错、check 模式、元器代码节点入口 main(params)。
在腾讯元器代码节点里用
scripts/sudoku.py 是单文件、纯标准库,整段粘进元器工作流的 Python 代码节点即可,入口是:
def main(params: dict) -> dict
# params: puzzle(题面,必填)、mode(solve/explain/hint/grade/check,默认 explain)、hint_n、board
# 返回: status / text(给用户看的全文)/ solution / difficulty / steps_count
边界
- 只支持标准 9×9;不做 OCR。
- 已知数少于 17 个的题一定不是唯一解,脚本会在多解提示里注明。
- 骨灰级题的讲解会出现若干次试数,这是正常的:人类高手在这类题上用的是更复杂的链(强制链、ALS 等),本技能不实现这些,统一用「验证过的试数」替代,并如实标注。