Python中的空填字游戏解算器

时间:2017-08-31 10:13:30

标签: python python-3.x algorithm crossword

我给出了一个包含填字游戏蓝图的矩阵 - 当然是未填充的。我们的目标是填补整个难题 - 这是Checkio的一项任务,而且我已经在相当长的一段时间里努力解决这个问题。

根据我对复杂性的理解,对于这个问题没有完美的算法。不过,必须有最好的方法来做到这一点,对吧?我已经尝试了一些不同的东西,并且随着填字游戏和/或字典中单词数量的增加,结果并不那么好。

所以,我尝试过的一些事情:

  • 简单的暴力强迫。根本没有工作,因为它一直无视 并覆盖十字路口。
  • 强制执行同时保留所有相关数据 - 按照预期使用特定字典工作,转向地狱 即使是字长优化也适度大。图。
  • 盲目交叉填充 - 我认为最好不要打扰交叉的单词而不是聚焦的想法 在信件上。就像从As开始,检查你是否可以填写 整个填字游戏有这些限制。如果它对一些人不起作用 单词,增加其中一个字母并再次尝试整个事情。 如你所料,结果很糟糕。
  • 递归探索 - 在更简单的蓝图上完美地工作,但在更复杂的情况下却陷入了困境。有一个简单的问题 循环已经解决得足够简单,但我没有找到 合理解决路径分裂的情况然后 稍后再重新加入几个分裂(所以没有什么可以留下来的 解决第二个分支,但它不知道那个。)。
  • 尽量减少交叉口 - 尚未对此进行测试,但看起来很有希望。我的想法是找到最短的单词列表 包含所有交叉点......也不与每个交叉点相交 其他。然后我可以为每个单词使用生成器,和 然后检查是否存在具有这些交叉点的​​依赖词。如果 他们没有,我只是从生成器中获取下一个字。

这就是我目前所处的位置。我决定在这里询问这个问题,因为我已经知道它需要花费更多的时间,而且我的最新想法甚至可能都不是正确的方法。

那么,正确的方法呢?

编辑: 输入是表示填字游戏的字符串列表和表示字典的字符串列表。输出是表示填充的填字游戏的字符串列表。

填字游戏的例子:

['...XXXXXX', 
 '.XXX.X...', 
 '.....X.XX', 
 'XXXX.X...', 
 'XX...X.XX', 
 'XX.XXX.X.', 
 'X......X.', 
 'XX.X.XXX.', 
 'XXXX.....']

the crossword

输出将是一个类似的列表,用填充的字母代替点。

请注意'字典'就是这样,一个小的英语词典而不是一个单词列表,作为这个难题的答案。

1 个答案:

答案 0 :(得分:3)

  

那么,做到这一点的正确方法是什么?

我不知道它是否是最佳的,但我会使用Floodfill的原则。

数据结构:

填字游戏单词及其交叉点。按字典中单词的数量对相应的字长进行排序。这很可能意味着你将从一个最长的单词开始。

字典可通过字长访问。

如果字典很大,能够快速找到具有特定n:字母的特定长度的单词将是有益的,其中n对应于交叉点位置。

请注意,对于每个填字游戏单词,在所有交叉点中适合且具有相同字母的任何两个单词都是等效的。因此,可以为每个填字游戏单词从字典中选择子集。子集是等价类的集合。因此,对于每个填字游戏单词,您可以创建字典的子集,其最多包含[字母表中的字母数]到[交叉数]的幂。该子集将构成可能适合特定填字游戏词的等价类。

算法:

  • 获取第一个/下一个未解决的填字游戏词。分配第一个/下一个 适合的词。

  • 走第一个/下一个十字路口。将另一个填字游戏词分配给第一个适合的词。

  • 如果之后没有其他交叉路口,请返回您来自的交叉路口并继续下一个路口。
  • 如果字典中没有适合的单词,则回溯一个交叉点并搜索适合的下一个单词。