如何使用大量单词生成字母网格

时间:2013-08-11 23:12:38

标签: algorithm

问题基本上是“如何为游戏'Boggle'生成良好网格,其中包含大量单词” good 被定义为包含大量单词5个或更多字母。

Boggle是一款游戏,你可以用骰子掷骰子,它们放在4x4网格中。例如:

H S A V
E N I S
K R G I
S O L A

可以通过水平,垂直或对角连接字母来制作单词。在示例格栅之上可以使词“VANISHERS”,“VANISHER”,“KNAVISH”,“矫正器”,“储蓄”,“沉降片”和周围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”。

有很多similar questions,但AFAICT不是这个问题。这显然是对“与朋友争抢”游戏的参考。

第一个解决方案是随机挑选字母,这个问题是,如果你意外地挑选所有辅音,就不会有任何语言。添加一些随机元音不足以保证一组好的单词。您可能只会得到1到4个字母单词,而一个好的算法会选择一组具有>的字母。单词200个单词> 7封信。

我对任何算法都持开放态度。显然,我可以编写代码来查找每个可能的网格的强力解决方案,然后用最多的单词对网格进行排序,但这个简单的解决方案将需要永远运行。

我可以想象各种启发式方法,例如选择一个长单词(8-16个字母),将这些字母随机地放在网格中,但实际上仍然可以制作单词,然后填充左侧空格。我怀疑这还不足以保证一套好词,尽管我还没有尝试过。

该解决方案可能需要预处理字典以了解单词的常见部分。例如,以“ing”或“ers”或“ght”或“tion”或“land”结尾的所有单词。或者以某种方式将它们组织成共享字母图。也许经常会插入某些字母组合,以便插入“ing”或“ers”。

想法?

3 个答案:

答案 0 :(得分:1)

如果没有蛮力搜索提案,可能无法保证您拥有良好网格。如果您使用在Boggle骰子上找到的字母频率,那么您将获得“平均”网格(就像您掷骰子一样)。您可以通过添加额外的启发式或过滤器来改进这一点,例如:

 ensure that (almost) every consonant is 'in-reach-of' a vowel
 ensure 'Q' is 'in-reach-of' a 'U'
 ensure the ratio of vowels to consonants is within a set range
 ensure the number of rare consonants is not too large
 etc

然后你可以

 set letters using weighted letter frequency
 change (swap/replace) letters not meeting your heuristics

除非您通过暴力检查,否则仍然可以通过错误的网格,但是您可以通过简单随机返回的网格大幅减少坏网格的数量生成网格。

或者,生成随机网格并根据需要执行强力工作以选择好的网格。但是在后台(需要之前几天或几周)这样做。然后存储一堆好的网格,并在需要时随意选择一个(并将其从列表中删除,这样你就不会再看到它了)。

答案 1 :(得分:0)

Boggle的工作方式是侧面有六面模具和一些字母。那些骰子随机分配到16个方格然后滚动。常见字母出现在骰子的更多面上。搜索 - 您可能能够获得精确的骰子。

答案 2 :(得分:0)

  1. 从字典中计算统计字母频率和字母对频率。

  2. 从随机选择四个中心方块之一开始

  3. 随机选择以单字母频率加权的该字母的字母。

  4. 递归:

    4.1。随机选择所有空连接方格中的一个。

    4.2。随机选择该方格的字母,加权由任何连接的填充方格的双字母频率和任何连接的空方格的单字母频率的组合(平均值)加权。

  5. Et瞧!

    P.S。您可能还想尝试根据网格中当前的出现次数将全局字母降额添加到4.2。