【发布时间】:2019-05-29 23:52:46
【问题描述】:
我得到了一个包含填字游戏蓝图的矩阵 - 当然是未填充的。我们的目标是填补整个谜题 - 这是 Checkio 的一项任务,我已经为此苦苦挣扎了很长一段时间。
根据我对复杂性的理解,对于这个问题没有完美的算法。不过,必须有最好的方法来做到这一点,对吧?我尝试了一些不同的方法,但随着填字游戏和/或字典中单词数量的增加,结果并不是那么好。
所以,我尝试过的一些事情:
- 简单的暴力破解。根本不起作用,因为它一直在忽略 并覆盖交叉路口。
- 暴力破解,同时保留所有相关数据 - 使用特定字典按预期工作,用 即使进行了字长优化,也适中。数字。
- 盲区填充 - 我认为最好不要打扰相交的单词,而是集中注意力的想法 在字母上。喜欢以 As 开头并检查是否可以填写 具有这些限制的整个填字游戏。如果它对某些人不起作用 单词,增加一个字母,然后再试一次。 如您所料,结果很糟糕。
- 递归探索 - 在更简单的蓝图上完美运行,但在更复杂的蓝图上表现平平。简单的有问题 简单地解决了循环,但我没有找到 路径分裂然后的情况的合理解决方案 稍后重新加入几个进一步的分裂(所以没有什么可以 解决第二个分支,但它不知道)。
- 最小化交叉口 - 尚未对此进行测试,但看起来很有希望。这个想法是我找到最短的单词列表 包含所有交叉点......也不与每个交叉点相交 其他。然后我可以为每个单词使用一个生成器,然后 然后检查是否存在具有这些交叉点的依赖词。如果 他们没有,我只是从生成器中获取下一个单词。
这就是我目前所处的位置。我决定在这里问这个问题,因为它已经到了我认为花费的时间比应有的时间更多的时候,即使这样,我的最新想法甚至可能都不是正确的方法。
那么, 正确的做法是什么?
编辑: 输入是表示填字游戏的字符串列表和表示字典的字符串列表。输出是代表填好的填字游戏的字符串列表。
填字游戏示例:
['...XXXXXX',
'.XXX.X...',
'.....X.XX',
'XXXX.X...',
'XX...X.XX',
'XX.XXX.X.',
'X......X.',
'XX.X.XXX.',
'XXXX.....']
输出将是一个类似的列表,其中包含填充字母而不是点。
请注意,“词典”只是一本小型英语词典,而不是适合作为该谜题答案的单词列表。
【问题讨论】:
-
谢谢你的描述,你能不能再添加一个拼图示例?此外,我不确定我是否完全明白了。你有一个填字游戏,你有一个填满这个谜题的单词列表,你是否在寻找应该放置它们的位置?还是我完全错了? ^^
-
"(...) 没有最佳解决方案 (...) 必须有最好的方法来做到这一点,对吧? “最优解”的定义。可能不存在的是“好的算法”,被理解为具有多项式最坏情况复杂度的算法。在任何情况下,您都没有正确描述您的问题(输入、预期输出、示例......)。
-
谢谢你的例子,但我只是看不到上面的交集。抱歉,我仍然没有看到填字游戏。
-
请稍等,我将对该输入进行可视化表示。
-
为了减少耗时的过程,您可以尝试通过查看英文字母的重新分区来改进您选择单词的方式。哪些字母用得最多?最常见的第一个字母有哪些?最后一封信?通过改进单词选择,您将减少错误,然后更快地解决问题。
标签: python python-3.x algorithm crossword