给定网格和单词的填字游戏

时间:2012-12-01 14:34:37

标签: c++ algorithm crossword

我有一个填字游戏网格,例如

+-----+
|  *  |
|     |
+-----+

和单词列表

a
ababa
bb
cc
ba
bb
ca
cb

必须使用每个字。目标是找到所有变体如何解决这个填字游戏,在这种情况下有两种变体 -

bb*cc
ababa

cc*bb
ababa

一些更复杂的填字游戏就像这样:

+-----+
|   * |
|     |
|    *|
|   * |
|  * *|
|  *  |
|     |
+-----+

列出20个单词等。

我试图创建算法来解决这类问题,但没有成功。有人能帮助我吗?

1 个答案:

答案 0 :(得分:0)

首先要注意的是,即使使用给定字典确定填字游戏是否“可解决”,NP-Hard 1 ,所以即使确定是否有0或更多解决方案也不能多项式完成( unless P=NP)。

因此,替代方案是使用exhaustive search解决方案 - 只需尝试所有可能“放置”单词,然后验证此解决方案是否有效。

伪码:

solve(words,grid):
   if words is empty:
       if grid.isValidSolution():
          print grid as a possible solution
          return
   for each word in words:
       candidate<- grid.fillFirstSpace(word)
       solve(words\{word},candidate)

(1)参考:Is P equal to NP第3.3节