给定目标状态
int final[3][3]={{1,2,3},
{4,5,6},
{7,8,9}};
和一个随机的初始状态,我想通过移动我的表的行(向右或向左)和列(向上和向下)来将我的数组排序为final
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
所以我想使用*搜索,我正试图找到一个好的启发式。
我已经尝试过错放的数组元素。
有什么建议吗?
答案 0 :(得分:2)
我认为这是一个代数问题。您将获得一组由6个周期(3行和3列)生成的排列,并且您希望找到更多可以帮助您进行任何排列的移动。
第一个建议:并非所有排列都是可能的!由于每个班次都是偶数置换(3个周期是两个换位的组合),因此甚至排列也是可能的。因此,你不会找到任何解决方案,其中所有都已到位,但两个交换的数字,如(2,1,3),(4,5,6),(7,8,9)。
第二条建议。如果r是行移位而c是coumn shift,则计算rcr'c'的动作,其中r'和c'是反向移位。这个“换向器”再次是3个元素的循环,但这次它们不是一行或一列。通过选择不同的r和c,你可以得到很多3个循环,可以在第三个建议中使用。
第三个建议。考虑已经处于最终位置的数字区域。对该组的补码应用3个循环以减少它,直到找到解决方案。