纵横填字谜发电器(瑞典纵横填字谜) - Java

时间:2014-03-07 14:07:41

标签: crossword

我正在尝试创建一个简单的Java生成器填字游戏(瑞典填字游戏) - 只是为了好玩。 我从互联网上下载了词汇量(约300,000字)。 这些单词我保存在HashMap中(按字长排序)。 生成器的输入是X和Y的大小以及拼图。 拼图我随机插入矩阵

但是我无法找出一个工作算法来填充矩阵的其余部分。

例如:

X X X X
X D O G
X X X X

有人有什么建议吗? 或者在互联网上有一些有用的文章? 谢谢。

1 个答案:

答案 0 :(得分:3)

这里描述了用于编译填字游戏的算法(如瑞典语,斯堪的纳维亚语等) (当然还有:))

https://stackoverflow.com/a/23435654/3591273

更新:发布SO链接中描述的算法的主要步骤(根据评论)

  1. 算法的第一步是随机选择一个空单词(网格词),并用相关单词表中的候选单词填充它(随机化可以在算法的连续执行中产生不同的解决方案)(复杂度O) (1)或O(N))

  2. 对于每个仍然空的字槽(与已经填充的字槽交叉),计算约束比(这可以变化,这很简单就是该步骤中可用解的数量)并按此排序空字符比率(复杂度O(NlogN)或O(N))

  3. 循环通过前一步计算出的空字符,并为每一个尝试一些cancdidate解决方案(确保"电弧一致性保留",即网格在此步骤后有解决方案如果使用这个词)并根据下一步的最大可用性对它们进行排序(即如果在那个地方当时使用该词,则下一步有最大可能的解决方案等)。(复杂度O(N * MaxCandidatesUsed))

  4. 填写该字词(将其标记为已填写并转到第2步)

  5. 如果没有找到满足步骤.3标准的单词,请尝试回溯到前一步骤的另一个候选解决方案(标准可能会有所不同)(复杂度O(N))

  6. 如果找到回溯,请使用替代方案,并可选择重置任何可能需要重置的已填充字词(将其标记为未填充)(复杂度O(N))

  7. 如果没有找到回溯,则找不到解决方案(至少使用此配置,初始种子等等。)

  8. 此外,当所有字槽都填满时,您有一个解决方案

  9. 该算法对问题的解决方案树进行随机一致的遍历。如果在某个时刻有一个死胡同,它会对前一个节点做一个回溯并跟随另一个路径。直到找到的解决方案或各个节点的候选者数量都已用尽。

    一致性部分确保找到的解决方案确实是一种解决方案,随机部分可以在不同的执行中生成不同的解决方案,并且平均而言具有更好的性能。

    PS试图避免在不同的SO答案之间来回复制粘贴,但是可能有些摘要可能很有用