让D成为字典。固定m和n。我们可以将寻找一个m×n矩形的问题构建为
约束满足问题(CSP)。
回溯与约束传播的结合是解决CSP的一种非常常见的方法。粗略地说,回溯意味着我们选择一个变量,猜测它的值,并递归地解决一个少一个变量的子问题,而约束传播则意味着尝试减少每个变量的可能性数量(可能为零,这意味着没有解决方案)。
例如,我们可以通过选择x
1,1=
Q
来开始一个3×3网格。
Q??
???
???
使用英语字典,x1,2和x2,1 的唯一可能性是 U
(在之前的Scrabble“单词”中)。
解决CSP的艺术在于平衡回溯和约束传播。如果我们根本不传播约束,那么我们只是使用暴力方法。如果我们完美地传播约束,那么我们就不需要回溯,但解决NP难问题的传播算法本身可能非常昂贵。
在这个问题中,在每个回溯节点上使用大型字典会变得很昂贵,除非我们有很好的数据结构支持。我将概述一种方法,该方法使用trie或DAWG快速计算由前缀扩展到完整单词的字母集。
在每个回溯节点上,我们分配的变量集合是Young表。换句话说,直到其上方和左侧的变量被分配之前,没有变量被分配。在下面的图表中, .
表示一个已分配的变量,*
和?
表示未分配的变量。
.....*
...*??
...*??
..*???
*?????
被标记为*
的变量是下一个被赋值的候选变量。选择多个选项而不是每次选择一个固定的变量的优点在于,某些变量排序可能比其他变量排序好得多。
对于每个*
,在trie / DAWG中进行两次查找,一次水平查找,一次垂直查找,并计算可以接下来出现的字母集合的交集。一种经典策略是选择具有最少可能性的变量,以便我们更快地达到矛盾。我喜欢这种策略,因为当存在零可能性的变量时,它会自然地修剪,并且当存在一个变量时,它会自然地传播。通过缓存结果,我们可以使评估每个节点非常快速。