程序是怎么自动出拼字谜题的?
你一定见过这种东西:
C A N T O R
G A U S S .
E U L E R .
A B E L . .
. . . . . .
. . . . . .
一个字母方格,藏着若干单词——横着、竖着,有时候斜着。找到它们是游戏,但出这道题才是有趣的工程问题:给你几个单词,怎么把它们都塞进格子里?
这件事比看起来难。单词可以斜放,可以反向,两个单词可能在某个格子相交——相交处的字母必须相同。暴力枚举所有摆法代价太大,还容易遗漏。
这篇文章介绍一种优雅的做法:把”出谜题”变成一个填色游戏,然后用舞蹈链算法自动求解。顺带揭露一个很容易写错的细节——以及 Knuth 用来修复它的一个小技巧。
从九连环到格雷码:每步只改一位的遍历秘密
引言
一个宋朝就有文献记载的传统玩具,和现代 5G 手机的信号调制算法,共享着同一个数学结构——你信吗?
前面几篇我们一直在和精准匹配、Dancing Link 打交道,解决的核心问题是”在组合空间里找满足条件的子集”。这篇换个方向——不是挑选,而是遍历:怎样把所有 n 位二进制串走一遍,而且每一步只改变一个 bit?
答案藏在一个中国传统智力玩具里。