【问题标题】:Algorithmic solution to Minesweeper扫雷的算法解决方案
【发布时间】:2013-04-11 19:24:16
【问题描述】:

我正在尝试制作扫雷求解器。如您所知,有两种方法可以确定雷区中的哪些字段可以安全打开,或者确定哪些字段已被开采并且您需要对其进行标记。第一种确定方法很简单,我们有这样的事情:

如果(X 附近的地雷数量 - X 附近当前发现的地雷数量)= X 附近未开垦的田地数量 then X 周围所有未开垦的田地都被开采了

如果(X 周围的地雷数量 == X 周围当前发现的地雷数量)则 X 周围所有未打开的字段均未开采

但我的问题是:当我们找不到任何已开采或安全的场地并且我们需要查看多个场地时,情况会怎样?

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

例如这种情况。我们无法使用以前的方法确定任何内容。因此,对于这些情况,我需要算法方面的帮助。

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

【问题讨论】:

  • 你可以避免写算法,让计算机自己学习,但我不能告诉你更多......:/
  • 我不明白您提供的示例图片。最左边的“2”表示左边第二行的两个字段都被挖掘,但第二个“2”表示只有其中一个被挖掘。这会在什么游戏背景下出现?您是否认为游戏的信息可能相互矛盾?
  • 但是您可以使用您的算法在该图像中找到一个安全字段。取2个包围的2个;两者周围的地雷数量等于目前在两者周围发现的地雷数量。因此,您可能会发现其上方的空白字段。或者,您的意思是,如果您的该字段尚未标记任何标志,您怎么知道要标记这两个标志?
  • 左右两侧未打开的字段较多。在左侧添加一列未打开的字段,在右侧添加一列,您就会明白。
  • 我认为您不会找到涵盖所有情况的一小部分规则,因为与未覆盖瓷砖相邻的一组覆盖瓷砖与下一个未覆盖瓷砖相邻的一组瓷砖相交, 等等。您可能必须通过一长串重叠的瓷砖进行推理,以便在不猜测的情况下做出正确的动作。一般来说,这是约束求解器的工作,从头开始实施并非易事。

标签: algorithm minesweeper


【解决方案1】:

真棒的问题,不过,在你太兴奋之前,请阅读NP Completeness and Minesweeper,以及随附的presentation,其中开发了一些好的最坏情况示例以及人类如何解决它们。尽管如此,如果我们使用基本的剪枝和启发式算法,我们很可能不会遇到时间障碍。

生成游戏的问题在这里问:Minesweeper solving algorithmalgebraic 方法上有一篇很酷的帖子。您也可以尝试回溯(即猜测一下,看看这是否会使事情无效),类似于本地信息不足以满足sudoku 之类的情况。请参阅有关此technique 的精彩讨论。

【讨论】:

  • 如果允许您从错误中备份,那么您可以只发现每个方格一次,并跟踪哪些方格有地雷。我认为也许 OP 正在寻找一个遵循与人类相同规则的求解器 - 即如果你做出错误的举动,你就会失败。
  • 是的,当然,当所有其他方法都失败时使用回溯,否则显然树会呈指数增长。
  • 但是你怎么能在不发现地雷并输掉比赛的情况下回溯呢?
  • 对不起,让我澄清一下。回溯意味着假装点击一个正方形(这当然不会显示任何新的正方形,因为它是假设的)。现在想想其他方块上的值是如何变化的,假设你点击的不是地雷。如果有一个方块变成
  • 我的错 - 我明白你现在在说什么了。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2018-01-02
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多