IDA* 非常适合 4x4 拼图,因为那只是 16!(20,922,789,888,000) 个可能的状态。一个 5x5 的拼图有 25 个!(15,511,210,043,330,985,984,000,000) 个可能的状态,大 74 万倍。
你需要转换策略。“最简单”的方法是先解决顶行然后左列的谜题,重复,直到你有一个 3x3 的谜题,这可以使用现有技术轻松解决。
解决难题涉及您交替使用的 3 个不同阶段:
- 解决第一行(将第 1 - N-2 列的棋子移动到位,然后将 N-1 列的棋子移到 N 列,将 N 列的棋子移到 N 列,但在下一行,完成该行)
- 解决左列(将第 2 - N-2 行的棋子移动到位,然后将第 N-1 行的棋子移到第 N 行,将第 N 行的棋子移到第 N 行,但向右移动一列,完成该列)
- (剩余 2 行 3 列):使用 A* 求解余数。
因此,阶段 1 和阶段 2 交替进行,直到您可以运行阶段 3;在解决前 5 个图块(第 1 阶段)后,您解决其他行(第 2 阶段)最左边的 4 个图块,然后是拼图其余部分的顶行(4 个图块,第 1 阶段),然后是左列( 3 个瓷砖,第 2 阶段),然后解决第 3 阶段。第 1 阶段和第 2 阶段基本相同,只是方向不同,第 2 阶段的第一个瓷砖已经到位。
使用查找表可以轻松解决阶段 1 和阶段 2,无需搜索;您正在移动特定的瓷砖并且不关心其他任何事情:
- 找到所需的瓷砖
- 获取瓷砖旁边的间隙(这取决于移动的方向,哪一边最好)
- 将瓷砖移动到位;有标准的移动可以在任何方向移动瓷砖(垂直或水平移动 5 个,对角线移动 6 个)。
这不会为您提供解决方案的最短路径,但是如果没有状态搜索,问题就会受到严格限制,并且已知最坏的情况。以这种方式解决 5x5 拼图的第一行和第一列最多需要 427 步,下一行和下一列最多需要 256 步。
这个算法最早是由Ian Parberry 在 1995 年的一篇题为A real-time algorithm for the (n2 − 1)-puzzle的论文中描述的。我认为DSolving: a novel and efficient smart algorithm for large-scale slippinguzzles by GuiPing Wang Ren Li仍然描述了一种更有效的查找表方法,但由于该论文尚未免费提供,因此我尚未研究它。