【问题标题】:How to find all possible words?如何找到所有可能的单词?
【发布时间】:2013-11-29 19:58:27
【问题描述】:
在 iPhone 上的 Word Scramble 游戏中,游戏会告诉您在每场游戏结束时您可以说出多少个潜在单词。
我想创建自己的 Word Scramble 游戏,也有这个功能,但我不知道他们是如何计算的。
他们不可能通过游戏中的每一个组合来找出它是否是一个单词,对吧?这是一个带有随机字母的 5x5 板。单词最多可以有 11 个字母。
帮帮我,我被踩了。
游戏看起来是这样的:
你用手指在限定时间内用字母造词。
【问题讨论】:
标签:
algorithm
graph-algorithm
【解决方案1】:
免责声明:我只见过这样的游戏,没有实现过类似的东西。
您可以使用一些回溯算法来做到这一点,该算法会生成单词并在字典中搜索它们。但是,对于 5x5 板,这将非常慢。因此,如果您已经生成了一些单词,您可以做的是搜索可以进一步生成的单词数量。比如你生成了the,你要搜索字数,以the..开头;如果该数量太低(例如“yoe”),那么您可以停止进一步搜索。通过这种方式,您可以修剪搜索树并实现您的目标。如果您的字典已排序,那么您可以通过使用简单的上限和下限(二进制搜索修改)来实现 O(log(number_of_words)) 的复杂度。
另一个有助于生成棋盘和答案的事情是让游戏与用户更具互动性 - 给他/她一些时间来查看他/她的分数、其他人的分数等,然后开始一个新的在那段时间之后的游戏(也许大约 10 秒就足够了)。通过这种方式,您可以预先计算下一块板上几乎所有可能的单词。
【解决方案2】:
替代解决方案是使用带有所有有效单词的trie。您可以利用它的结构来有效地修剪搜索空间。
对于单词最多为 11 个字母的 5x5 棋盘,可能组合数量的粗略上限是 100,000,000 个单词。其中大部分不是有效单词(例如图像最后一行中的 TNPU)。因此,通过在搜索过程中进行适当的修剪并为您的字典提供快速的数据结构,您应该能够在现代智能手机上相当快地做到这一点。