扫雷的算法解决方案

时间:2013-04-11 19:24:17

标签: algorithm minesweeper

我正在尝试制作扫雷舰解算器。如您所知,有两种方法可以确定雷区中的哪些字段可以安全打开,或者确定哪些字段是已开采的,您需要标记它。确定的第一种方法是微不足道的,我们有类似的东西:

if(X周围的地雷数量 - X周围已发现地雷的当前数量)= X周围未开场数量  X周围的所有未打开的字段都已开采

if(X周围的地雷数= = X周围发现的当前数量)然后  X周围的所有未打开的字段都未被挖掘

但我的问题是:当我们找不到任何开采或安全区域时我们需要查看超过1个字段的情况如何?

http://img541.imageshack.us/img541/4339/10299095.png

例如这种情况。我们无法使用以前的方法确定任何内容。所以我需要为这些案例提供算法帮助。

我必须使用A *算法才能做到这一点。这就是为什么我需要所有可能的安全状态来进行算法的下一步。当我找到所有可能的安全状态时,我会将它们添加到当前最短路径中,并且根据启发式功能,我将对路径列表进行排序,并选择需要打开的下一个字段。

2 个答案:

答案 0 :(得分:8)

令人敬畏的问题,在你太兴奋之前,请阅读NP Completeness and Minesweeper,以及附带的presentation,其中提出了一些很好的最坏情况的例子以及人类如何解决它们。然而,如果我们使用基本的修剪和启发式方法,我们很可能不会遇到时间障碍。

这里询问生成游戏的问题:Minesweeper solving algorithm。关于algebraic方法的帖子非常酷。您还可以尝试回溯(即猜测并查看是否会使事情无效),类似于sudoku之类的本地信息不足的情况。请参阅有关此technique的详尽讨论。

答案 1 :(得分:1)

正如@tigger所说,这不是一个可以用一套简单的规则解决的问题。扫雷是一个很好的例子,其中回溯算法如DPLL很有用。通过像命题逻辑这样简单的东西,您可以为扫雷操作实现一个非常有效的求解器。我不确定你是否熟悉AI推理&逻辑推理 - 如果没有,你可能想看看Stuart Russel和Peter Norvig所着的“人工智能 - 现代方法”一书。要快速参考DPLL和命题逻辑,请在Google上搜索“wumpus world propositional logic”。