c - 移动数组的启发式

标签 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                                                          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 个循环来减少它,直到你得到一个解决方案。

关于c - 移动数组的启发式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23802068/

相关文章:

c - 为什么我的提示第一次重复两次?

c# - 如何在 QuickGraph Dijkstra 或 A* 中设置目标顶点

Java A* 实现产生两个连接节点

algorithm - Heuristic 将如何影响 Dijkstra 算法使其成为 A* 算法

python - 加权元素的笛卡尔积

algorithm - 紧凑图像缩略图的布局算法

C - 将一个字节的三位与一个字节组合

c - 在 C 中使用 mmap 或 fscanf 读取文件

c - 使用 C 在 Linux 中使用 USB 串行电缆从传感器串行读取

c++ - boost 隐式图和 astar_search_no_init