四乘四数独只有十二种解:以及找最小子集的一个技巧
来源: baldino.dev — 2026-09-14
概述
作者从「4×4 数独到底有多少种解」这个问题出发展开了一篇算术漫游。数字本身没有意义,交换符号不会改变谜题结构,因此在把 1-4 的排列视为同构之后,原本 288 个合法填法只剩 12 种本质上不同的解:288 恰好是 12 乘以 4!。接着他把问题转向谜题:枚举所有可能的起始局面会得到 85632 个有效谜题,按置换归并后是 3568 个;其中最小谜题(去掉任意一个已知数字解就不再唯一)的总数,因解的结构不同而分成两档——192 个解只对应 304 个最小谜题,另外 96 个解对应 284 个。文章最后给出一个实用技巧:用位掩码枚举候选子集时,先把每个子集映射成掩码,再按位计数筛选上下界,就能把搜索空间压下来,无需逐一暴力验证。作者也诚实地留下警告:这段 Python 跑完要约两到三分钟,仓库名就叫「糟糕的 Python 代码」。
核心要点
- 若不区分符号置换,4×4 数独只有 288 个解;按 4!=24 种数字置换归并后,本质不同的解只有 12 种。
- 全部有效起始局面有 85632 个,按置换归并后为 3568 个,对比 9×9 标准数独解数超过 6.67×10^21 可谓微不足道。
- 最小谜题的数量并不均等:192 个解各自对应 304 个最小谜题,另外 96 个解只对应 284 个。
- 找最小子集的技巧是把候选集合转成位掩码后按 bit_count 过滤上下界,避免对每个子集做重复的唯一性验证。
金句
只要你不介意置换,就有 12 种本质不同的 4×4 解、288 个填法,而合法起始局面只有 85632 个——按置换算则仅剩 3568 个。
👍 0
👎 0
返回 Lobsters 首页