Boggle 是一种游戏,您将带有字母的骰子滚动,它们被放置在4x4的网格中。例如:
H S A V
E N I S
K R G I
S O L A
文字可以通过水平、垂直或对角线连接字母来形成。在上面的 好 的示例网格中,您可以根据使用的字典制作“VANISHERS”、“VANISHER”、“KNAVISH”、“ALIGNERS”、“SAVINGS”、“SINKERS”和大约271个其他单词,例如“AS”、“I”、“AIR”、“SIN”、“IS”等...
作为一个糟糕的例子,这个网格
O V W C
T K Z O
Y N J H
D E I E
只有约44个单词,其中只有2个单词的长度> 4个字母。"TYNED"和"HINKY"。
有很多{{link1:相似的问题}},但据我所知没有这个确切的问题。这显然是对游戏“Scramble with Friends”的参考。
第一个解决方案是随机选择字母,但问题在于如果您意外选择了所有辅音字母,则不会有单词。添加一些随机元音字母不足以保证一个好的单词集。您可能只会得到1到4个字母的单词,而一个好的算法将选择一个具有> 200个单词的字母集,其中许多单词> 7个字母。
我可以接受任何算法。显然,我可以编写代码来强制解决方案,找到每个可能的网格,然后按具有最多单词的网格进行排序,但是这个简单的解决方案需要运行很长时间。
我可以想象各种启发式方法,例如选择一个长单词(8-16个字母),随机将这些字母放在网格中,但以实际上仍然可以组成该单词的方式填充剩余的空间。我怀疑这也不足以保证一个好的单词集,但我还没有尝试过。
可能需要对字典进行预处理才能找到单词的共同部分,例如所有以“ing”、“ers”、“ght”、“tion”或“land”结尾的单词。或者将它们组织成共享字母的图表。也许会给某些字母集合加权,使得“ing”或“ers”经常被插入。
有什么想法吗?