Algorithm 求解任意孔数的类滑动谜题

Algorithm 求解任意孔数的类滑动谜题,algorithm,sorting,Algorithm,Sorting,我已经尝试搜索了一段时间,但没有找到解决方案,所以我想我会问自己的 考虑一个MxM 2D孔网格和一组随机放置在网格中的N个球。您将获得网格中N个球的一些最终配置,您的目标是移动网格中的球,以在尽可能短的时间内实现此最终配置 允许进行的唯一移动是将网格的任何连续子部分(在行或列上)移动一个空间。听起来有点混乱;基本上,您可以选择网格中直线上的任意一组点,如果是一行,则将该小节中的所有球向左或向右移动一点,如果是一个洞,则向上或向下移动一点。如果这是令人困惑的,那么考虑另一个问题是很好的,你唯一能做

我已经尝试搜索了一段时间,但没有找到解决方案,所以我想我会问自己的

考虑一个MxM 2D孔网格和一组随机放置在网格中的N个球。您将获得网格中N个球的一些最终配置,您的目标是移动网格中的球,以在尽可能短的时间内实现此最终配置

允许进行的唯一移动是将网格的任何连续子部分(在行或列上)移动一个空间。听起来有点混乱;基本上,您可以选择网格中直线上的任意一组点,如果是一行,则将该小节中的所有球向左或向右移动一点,如果是一个洞,则向上或向下移动一点。如果这是令人困惑的,那么考虑另一个问题是很好的,你唯一能做的就是把一个球移动到任何一个相邻的地点。需要注意的是,两个球永远不能重叠

最终,这个问题基本上归结为经典的滑动瓷砖拼图的一个版本,有两个关键区别:1)可以有任意数量的洞,2)我们事先不知道瓷砖的编号-我们不关心哪个球最终进入最后的洞,我们只想在一切都说了又做了之后,填补最后的漏洞

我正在寻找关于如何将经典的滑动谜题解决方案适应这两个约束的建议。任意数量的洞可能很容易有效地实现,但事实上,我们不知道哪些球在开始时注定要进入哪个洞,这让我陷入了困境。任何建议(或类似问题的实施)都将不胜感激。

如果我能很好地理解:

  • 所有的球都是相等的,无法区分-它们可以占据网格上的任何位置,起始状态是网格上球和孔的随机配置
  • 网格中有
    nxn=球+孔=单元数
  • 您的目标是达到给定的配置
这似乎是一个相当琐碎的问题,所以可能我忽略了一些约束条件。如果这确实是一个问题,可以这样解决:

  • 考虑到你移动的是球洞,而不是球
  • 在目标配置中的每个孔和每个孔位置之间执行搜索
  • 尽可能减少将孔移动到最近目标的步数。(如果需要的话,可以使用BFS)-也就是说,您可以使用此度量作为启发式,以一种*可能的方式来排序移动。我认为对于50x50网格,搜索速度会非常快,因为您的启发式算法非常精确,几乎不需要计算成本

解决这样一个问题:你可以在一条线上的多个位置移动一个孔,或者在一个文件上移动一个孔,这并不复杂;您可以通过在队列中添加可能的移动/后续步骤来解决此问题。

这就是它的要点。我想我希望有一个比穷尽搜索更确定的解决方案。最终,网格可能会很大(50x50),大约有一半的洞被填满,并且为给定的开始/结束配置找到正确的移动集的时间很重要,因此执行BFS搜索可能会非常慢。另外,如果我理解正确,您是说将a孔移动到最近的孔目标始终是最佳的吗?我想我误解了,因为这似乎不正确。不,我没有这么说,但你可以用它作为一种启发,以一种可能的方式来安排动作。我认为对于50x50网格,搜索速度会非常快,因为您的启发式算法非常精确,几乎不需要计算成本。