【问题标题】:solution to standard puzzle标准谜题的解决方案
【发布时间】:2023-03-13 09:32:01
【问题描述】:

有一个棋盘,其中有 m*m 个盒子,每个盒子都分配了一个非零整数,除了一个被标记为 0 并被视为空的盒子。只有空盒子的垂直和水平邻居可以向它移动,留下它们的放置为空置。为了解决这个难题,我们必须按照它们的价值递增的顺序排列盒子,空置的盒子(标记为零的盒子)在最后(板的右下角)。但是像所有其他工程师一样,我们非常懒惰,想用最少的步骤解决它。

那么除了回溯,我们应该遵循什么方法。

m 为 500.. 即 500x500 板。

【问题讨论】:

  • 假设你的矩阵是[[1,0,5],[2,3,4],[6,7,8]],最终结果应该是[[1,2,3 ],[4,5,6],[7,8,0]],我理解了吗?
  • 必须使用回溯...添加一些启发式算法,例如贪心算法。所以我猜所有的块都会从左上角到右下角按降序排列?是吗?
  • @ShivamKalra 按从左上角到右下角的递增顺序,最后一个元素为 0。
  • 这被称为 n-puzzle(15-puzzle 是最流行的版本)en.wikipedia.org/wiki/15_puzzle 解决它的一种算法被命名为 A* 在 SO 示例上有很多问题:stackoverflow.com/questions/9171665/a-and-n-puzzle-optimization

标签: algorithm puzzle


【解决方案1】:

您可以通过简单地对数组进行排序来找到目标状态。假设您的目标状态是g,那么解决难题的简单但效率低下的算法将是:

void solve()
{
    if(current_state == g)
        return;

    foreach(choice c in shifting_choices)
    {
      // shift neighbour
      apply choice;
      solve();
      undo choice;
    }
}

在上述算法中choices基本上是移动被zeroth块包围的块。

要改进算法,您可以使用 A*(最好优先)。为了找到最佳选择,您可以使用Manhattan Distance。它基本上是在谜题中到达另一个街区所需的步骤。考虑如下:

6 2 1
5 0 3
4 7 8

在上述情况下,您可以移动2, 5, 3, 7,但要找到最佳移动,请考虑目标状态:

8 7 6
5 4 3
2 1 0

当您将一个块移动到zeroth 块时,您正在更改两个块的位置。从目标状态中的位置计算这两个块的曼哈顿距离之和。最小总和内的选择将是最可取的:

Moving 2: 2 + 3 = 5

Moving 3: 1 + 1 = 2

Moving 7: 1 + 1 = 2

Moving 5: 1 + 2 = 3

您可以通过检查 3 和 7 之前的位置来打破 3 和 7 之间的平局,3 位于正确的位置,因此 7 是局部最优选择。

【讨论】:

  • 算法是否保证以曼哈顿距离最小达到目标状态的解是最优解???
  • 你知道你的目标状态之前......算法只有在你达到你的目标状态时才会停止......
猜你喜欢
  • 2021-02-01
  • 1970-01-01
  • 2020-05-14
  • 1970-01-01
  • 2020-08-29
  • 1970-01-01
  • 2016-11-08
  • 2011-11-20
  • 1970-01-01
相关资源
最近更新 更多