algorithm - 推箱子游戏 : move boxes automatically

标签 algorithm graph-algorithm

我已经实现了一个功能,当 keeper 使用广度优先搜索算法自动移动时。现在我希望它也能自动移动盒子(如果管理员可以在不移动另一个盒子的情况下将盒子从源移动到目的地)。我该怎么做?我试过修改BFS,还没有成功。

更新:我不需要解开这个谜题。相反,我想开发方便的用户界面,当用户可以用鼠标移动框时。为此,我需要一些算法,它可以计算移动序列。但这只是关于移动单个盒子,如果没有其他盒子应该移动的话。

最佳答案

像以前一样使用广度优先搜索(如果您愿意,也可以使用 A*),但搜索适当的状态集。

当您为守门员搜索路径时,状态对应于网格中的方 block 。但是,当您为守门员寻找移动方 block 的方法时,状态对应于网格中的正方形(一个用于守门员,一个用于方 block )。

这是最小的重要示例。假设我们有一个带有如下标记的方 block 的推箱子关卡:

Sokoban level with squares numbered 1 to 6

网格包含守门员和一个方 block 。状态空间由守门员和区 block 占据的成对正方形组成。有 56 个这样的状态,在下图中绘制为小圆圈。

state space with 56 states

线条显示了该状态空间内可能的转换。细线对应于守门员的移动(并且是双向的)。粗线对应于插入方 block (因此只能朝一个方向移动)。您需要搜索的是这个状态空间。

例如,如果 block 从 7 开始,守门员从 8 开始,那么守门员可以按照状态空间中的红色路径将 block 推到 8:

non-trivial path in state space

请注意,沿着这条路径,方 block 经过位置 7–6–5–6–7–8。仅考虑 block 的位置是无法找到这条路径的,因为 block 经过位置 6 和 7 两次。

关于algorithm - 推箱子游戏 : move boxes automatically,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9995419/

相关文章:

algorithm - 约束满足 : Choosing real numbers with certain characteristics

algorithm - 使用 DFS 序列化树

algorithm - 在有向加权图中找到两个节点之间的最短路径

c - 在通过使用 16 位算术评估一个系列来计算 π 时避免溢出?

c# - C# 中的组合生成器

arrays - 满足以下关系的数组中的最长序列 X[ i ] = X[ i-1 ] + X [ i-2 ]

algorithm - 减少图表上的数据点?

c 显示图的邻接表

algorithm - 是否有任何算法可以计算包含相同节点的两个图之间的编辑距离?

c++ - 是否可以检查两个二叉树在线性时间内是否同构?