【问题标题】:How to enumerate all states in the 8-puzzle?如何枚举 8-puzzle 中的所有状态?
【发布时间】:2013-10-29 18:21:39
【问题描述】:

我正在解决 8 谜题。这是一个看起来像这样的问题:

图片由:https://ece.uwaterloo.ca/~dwharder/aads/Algorithms/N_puzzles/ 提供(您还可以在此处查看 8 拼图的更详细说明)。用户可以将与空白相邻的正方形移动到空白中。任务是恢复如图所示的排列,从一些任意排列开始。

现在,当然可以将状态描述为 9 位数字的排列。如图所示,排列为:

1 2 3 4 5 6 7 8 0

但是,并非所有排列都可以从显示的配置中获得。因此,我有以下问题。

  1. 通过将瓷砖滑入空白处,从所示的初始配置中可以获得多少排列?

  2. 调用上述 N 的答案。现在,我想要一个从 1 到 N 的整数到排列的 1-1 映射。也就是说,我想要一个接受排列并返回适当整数的函数,以及一个接受整数并返回排列的函数。映射必须是双射(即不完美的哈希是不够的)。

【问题讨论】:

  • 8-puzzle 不是有一个属性,即从任何开始状态都可以达到恰好一半(全部)排列吗?
  • user2864740,我不知道。如果你知道解释这个的地方,请分享。
  • 已经有一段时间了,但我想我记得有两个不同的“可解”和“不可解”状态集。也许stackoverflow.com/a/11923585/2864740 包含相关信息。
  • @user2864740 - 这是正确的。恰好有两个等价类的可达配置。用于证明 15 谜题 (see here) 的这一事实的技术同样适用于 8 谜题。 (事实上​​,存在任意 m x n 个谜题的证明。)
  • Google 是您的朋友:Complete Solution of the Eight-Puzzle 等。

标签: algorithm artificial-intelligence sliding-tile-puzzle planning


【解决方案1】:
  1. 181440
  2. 将它们放在一个数组中并对其进行排序,例如按字典顺序。然后将整数转换为排列是 O(1),反之则是 O(log n)。

【讨论】:

    【解决方案2】:

    好吧,如果您只想列举可以达到的不同可能状态,您可以从初始状态开始进行深度优先搜索。在给定当前状态的情况下,很有可能生成有效的下一个状态,例如:将一个瓦片向下移动到空白空间与在排列中将 0 瓦片与在它之前的瓦片 3 交换(如果有的话)相同。因此,您只需执行 dfs 并将所有排列的哈希集保留为您访问的数组,该数组可以存储为整数或字符串。只有9个!可能的状态只有 362880。如果您需要从整数集中进行 1-1 映射,只需将哈希集设为哈希表,每次找到新状态时,只需将其添加到下一个索引处的哈希表即可。您也可以通过先进行广度而不是在找到已解决状态时才打破来找到最短的解决方案。

    【讨论】:

      猜你喜欢
      • 2014-02-14
      • 2014-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-28
      • 1970-01-01
      • 1970-01-01
      • 2010-10-01
      相关资源
      最近更新 更多