C 移位数组的启发式算法

C 移位数组的启发式算法,c,a-star,heuristics,C,A Star,Heuristics,给定目标状态 int final[3][3]={{1,2,3}, {4,5,6}, {7,8,9}}; 在一个随机的初始状态下,我只想通过移动表中的行(右或左)和列(上下)对数组进行最终排序 7 8 4 by shifting to the right the first row it will become 4 7 8 2 1 9

给定目标状态

int final[3][3]={{1,2,3},
                 {4,5,6},
                 {7,8,9}};
在一个随机的初始状态下,我只想通过移动表中的行(右或左)和列(上下)对数组进行最终排序

   7 8 4    by shifting to the right the first row it will become 4 7 8
   2 1 9                                                          2 1 9
   6 5 3                                                          6 5 3
所以我想用一个*搜索,我想找到一个好的启发

我已经试过使用放错位置的数组元素


有什么建议吗?

我认为这是一个代数问题。你得到了一组由6个循环(3行3列)生成的排列,你想找到更多的移动来帮助你获得任何排列

第一条建议:并非所有的排列都是可能的!由于每个移位都是偶数置换(3-循环是两个置换的组合),因此只有偶数置换是可能的。因此,对于一个配置,您将无法找到任何解决方案,其中所有配置都已就位,只有两个交换的数字,如(2,1,3)、(4,5,6)、(7,8,9)

第二个建议。如果r是行移位,c是列移位,则计算rcr'c'的作用,其中r'和c'是逆移位。这个“换向器”又是一个由3个元素组成的循环,但这次它们不在一行或一列中。通过选择不同的r和c,你可以得到很多3个循环,可以在第三个建议中使用


第三条建议。考虑已经处于最后位置的数字区域。对该集合的补码应用3个循环以减少它,直到找到解决方案。

继续尝试。想想看。喝咖啡。做笔记。再试一次。重复。我的想法是,如果我展开初始数组的树,我将有12个可能的移动(移位),因此我将选择最小f=g+h的移动。现在,我的第一个问题是找到一个更好的启发式,第二个问题是如果我使用4x4数组或5x5数组,我如何计算g成本。我不知道f,g,h是什么。。。我的建议是从一个抽象的数学角度来研究这个问题,而不是盲目地寻找可能的动作。