我希望有一种方法可以在Python中创建以下类型的双字方块。我有一个给定的单词列表,其中应包含要在单词square中使用的单词。我能想到的当前方式是“蛮力”方式,对于任何大于4x4网格的方式来说效率非常低。
S C E N T
C A N O E
A R S O N
R O U S E
F L E E T
我将不胜感激。
答案 0 :(得分:4)
图论/搜索算法可以在这里提供帮助。假设我们已经像这样布置了董事会:
SCENT
CANOE
ARSON
ROUSE
?????
...而且我有一个单词要坚持到最后一个位置。电路板的这种状态(上面)是树中的节点。让我们说在那个地方还有5个字要坚持:我还有5个状态(节点)可以去。这在此过程的早期更有价值:
SCENT
?????
?????
?????
?????
再次,将此视为树中的节点。在这里,也许我有13个可能的单词。这13个选项中的每一个都将我带到一个有12个选项的节点,其中12个中有12个有选择,等等。我们正在探索的树看起来像这样:
?
|
SCENT
?????
?????
?????
?????
/---/ | \-----\----\
/ | \ \ \
| | \ \ \
SCENT SCENT ? ? ?
CANOE ARSON
????? ????? ... etc ...
????? ?????
????? ?????
| | / | \
| | / \ \
? ? / | \
SCENT ? ?
ARSON
CANOE
?????
?????
暴力解决方案将完全探索这棵树,访问每个节点。但是,节点数通常非常高。我们的想法是有效地探索它:如果我们可以确定只填充了两个单词的“节点”将永远不会产生任何有效的解决方案,我们就可以在那时停止探索:我们消除了那个节点和所有节点在它下面。 Wikipedia's article on Brute-force searching提到了这一点:
加速强力算法的一种方法是通过使用特定于问题类的启发式方法来减少搜索空间,即候选解决方案集。例如,在八皇后问题中,挑战是在标准棋盘上放置八个皇后,这样就不会有任何其他女王攻击。由于每个女王可以放置在64个方格中的任何一个中,原则上可以考虑648 = 281,474,976,710,656种可能性。然而,因为皇后都是相同的,并且没有两个皇后可以放在同一个方格上,所以候选人都可以从所有64个方格中选择一组8个方格;这意味着64选择8 = 64!/ 56!/ 8! = 4,426,165,368候选解决方案 - 约为先前估计的1/60,000。此外,在同一行或同一列上没有两个皇后的安排可以是解决方案。因此,我们可以进一步限制这些安排的候选人。
正如这个例子所示,一点点的分析通常会导致候选解决方案数量大幅减少,并可能将棘手的问题变成一个微不足道的问题。
那么,我们怎么做呢?这是你必须聪明,诚实的部分。您可以做多种可能的事情。例如,当我们填写两个单词时:
SCENT
CANOE
?????
?????
?????
我们看到,为了使其成为有效状态,我们需要使用以SC,CA,EN,NO和TE开头的单词。 (一旦我们填写了最后一个单词,这些就是沿着垂直方向的单词。)如果我们缺少以这些前缀开头的单词,那么这将不会生成有效的解决方案,因为我们没有可能的垂直单词。如果我们能够快速确定,那么我们可以快速消除这种状态,以及处于这种状态的所有可能结果:如果这在蛮力中特别早,这可能是有价值的。
我们可以通过生成所有单词的所有前缀的集合来在O(1)时间内执行诸如“前缀检查”之类的操作。假设 n 长度为 L 的单词,则需要执行O( nL )。要检查前缀是否有效,我们只看它是否在集合中。
当然,如果我们的单词列表包含(对于您的示例)所有可能的5个字母单词,这将使我们无处可去,因为每个前缀都可以。但是,你可能没有给出这样的清单。
您可以将前缀设置为前缀→具有该前缀的单词的地图。如果前缀中只有一个单词,我们现在可以把它放在主板上。 (如果它不属于那里,那么什么都不会。)当然,这将使在董事会上放置更多复杂的词语。
图论也有助于蛮力:一旦你将问题看作图形或树,你就会发现“蛮力”只是一种树木探索算法:它只是节点本身,以及如何你在不同的人之间移动。
答案 1 :(得分:1)
我会列出一对具有共同字母的单词列表,以及这些单词中字母的索引,然后搜索交叉点的不同组合,直到获得排列单词的交叉点组合为止。方。