所以我在大学开始之前开始练习一些算法和编程,我遇到了这个问题:
给定一个包含0到8数字的3x3矩阵,找到以下列格式对矩阵进行排序所需的最小步骤数:
1 2 3
4 5 6
7 8 0
在一次移动中,只允许选择与包含0的单元格相邻的单元格并交换这两个单元格。
现在,我真的很困惑这个,并且不知道如何开始。任何提示我开始的提示和想法都会受到赞赏。
如果有人这么想,这不是功课,我只是想锻炼身体,而且我遇到了更棘手的问题。我不是在寻找任何人为我编写代码,我只需要一个正确的方向,因为我真的想了解这背后的算法。谢谢。
答案 0 :(得分:2)
注意:这实际上是一个AI问题,而不是一个简单的数据结构/算法问题。
此问题称为n-puzzle
问题。您问题中的示例是8-puzzle
问题。
解决这个问题的方法是尝试以每一步让你更接近你的最终目标的方式洗牌。将此视为贪婪的方法(Best-first search
)。这里使用的最佳算法是A* algorithm。
我们将游戏状态定义为棋盘位置,数量 移动到达董事会的位置,以及之前的状态。第一, 插入初始状态(初始板,0移动和空值) 先前的状态)进入优先级队列。然后,从优先级中删除 以最小优先级排队状态,并插入到 优先级排队所有邻近状态(可以到达的状态) 一举一动)。重复此过程,直到出队的状态为目标 州。这种方法的成功取决于优先权的选择 国家的功能。我们考虑两个优先功能:
汉明优先功能。错误位置的块数,加上到目前为止进入状态的移动次数。直觉上,在错误位置有少量块的状态接近目标状态,我们更喜欢使用少量移动达到的状态。
曼哈顿优先功能。从块到目标位置的距离(垂直和水平距离的总和)加上到目前为止到达状态的移动次数之和。
例如,汉明和曼哈顿的初始状态优先级 以下分别为5和10。
8 1 3 1 2 3 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 4 2 4 5 6 ---------------------- ---------------------- 7 6 5 7 8 1 1 0 0 1 1 0 1 1 2 0 0 2 2 0 3 initial goal Hamming = 5 + 0 Manhattan = 10 + 0
我们做出一个关键的观察:从一个特定的州解决这个难题 在优先级队列上,我们需要进行的移动总数 (包括那些已经制作的)至少是它的优先考虑,使用其中之一 汉明或曼哈顿优先功能。 (汉明优先, 这是真的,因为每个不合适的区块都必须移动 至少一次达到目标位置。对于曼哈顿的优先权,这是 是的,因为每个区块必须从其目标移动其曼哈顿距离 位置。请注意,我们在计算时不计算空白图块 汉明或曼哈顿的优先事项。)
因此,只要我们一个国家出局,我们就不仅有 发现了从初始板到板的一系列移动 与国家相关联,但是数量最少的国家 移动。
(Source)