我在http://www.puzzles.ca/wordsearch/transportation.html找到了一个拼图,其中一个人必须在网格中找到单词,并且他可以从8个方向读取单词。我想到了以下问题:
我们得到了一套词。找到一个算法,将这些单词放在n x m
网格中,并给出n
和m
。有没有人建议算法创建合适的网格,因为如果网格的大小只是足以使字母符合网格并且单词重叠,那么问题似乎很难?
答案 0 :(得分:5)
此SO问题中也描述了一种算法
https://stackoverflow.com/a/23435654/3591273
希望这有帮助
更新:算法摘要(如前一个链接所示)
从网格中随机选择要填充的第一个空字槽,并用合适的字填充
查找所有与已填充的字样交叉点的空单词
按约束比例对其进行排序(例如每个可用解决方案的数量)
循环上一步的空槽并尝试一些候选词(来自可用词)
选择单词时间和要填充的单词保留网格一致性(即网格在此单词插槽填充此单词后有解决方案),并且下一步中的解决方案数量最大(这可以最小化bactracks in接下来的步骤)并转到第2步
如果在上一步中找不到任何单词,请尝试回溯到上一个单词并使用替代候选人(除非可用的候选人已用尽)
可选择重置在回溯后可能需要重置的任何字槽(即再次将其标记为空)并转到步骤2
如果没有找到回溯,那么此配置没有解决方案
如果所有空插槽都已填满,则您有一个解决方案