如何以编程方式解决15个(移动数字)难题?

时间:2010-09-01 19:49:33

标签: puzzle

你们所有人都可能已经看过移动的数字/图片拼图。你在4x4网格中有1到15的数字,并试图从随机起始位置到

的那个
1   2  3  4
5   6  7  8
9  10 11 12
13 14 15 

我的女朋友或我的一些非程序员朋友可以通过一些愚蠢的魔法来解决这个问题,他们无法向我解释。我无法解决这个难题。

我发现最有希望的方法是解决第一行,然后我会得到

1   2  3  4
X   X  X  X
X   X  X  X
X   X  X 

然后第一列没有触及解决的细胞

1   2  3  4
5   X  X  X
9   X  X  X
13  X  X 

然后第二行到

1   2  3  4
5   6  7  8
9   X  X  X
13  X  X 

然后第二栏

1   2  3  4
5   6  7  8
9   10  X  X
13  14  X 

问题是,剩余的X(随机)磁贴有时处于无法解决的位置,这就是我的解决方案失败的地方。但我觉得好像我走在正确的道路上。

我的程序通过尝试将数字X到达指定位置来解决指定的行/列,如果可能的话,不会弄乱正确的单元格。但它无法在2x2网格上完成最后3个图块。我错过了什么?

7 个答案:

答案 0 :(得分:10)

确保您的拼图首先可以解决。 Not all are

否则你的策略看起来很合理。

答案 1 :(得分:6)

你肯定是在正确的轨道上,而不是通过行/列迭代地解决到留下2x2的点,解决直到你有一个最小3x3然后解决那个网格。 3x3是正确重新排序网格所需的最小尺寸(而2x2并不能提供您可能需要的完全灵活性,如您已经讨论过的那样)。这种方法也是可扩展的 - 你可以解决5x5,10x10等问题。

答案 2 :(得分:3)

这个site对3x3网格有一个很好的解释,你可以很容易地把它扩展到4x4。

答案 3 :(得分:3)

我认为解决这个问题最有效的方法是使用附加模式,带有可接受的启发式算法和IDA *算法。如此处所述 - http://www.aaai.org/Papers/JAIR/Vol22/JAIR-2209.pdf。 (我认为Felner告诉我们他找到了一种更好的方法,但我不记得究竟是什么(双向A *?),但无论如何这应该足够了( - :)。
无论如何这个课程很久以前,所以我建议阅读这篇文章..
HTH。小心。

答案 4 :(得分:1)

通过缩减,您无法解决的唯一可能情况必须是形式
1 3
2 X
你想得到它 1 2
3 X

通过使用额外的行和列,您可以使用简单的预先计算的序列将它们移动到正确的位置

答案 5 :(得分:1)

原始海报所描述的解决方案策略将始终适用于标准的可解决的15拼图。如果Axarydax可以将15个谜题减少到他/她描述的状态并仍然无法解决它,那么就不可能开始了。让我解释一下。

如果我们将拼图中的空白处理为其中一个拼贴,则每个合法的移动都涉及交换相邻拼贴的空白“拼贴”。这允许我们将拼图上的动作视为16个字符的排列。即,对称组S 16 的元素。每个原始移动只是两个元素之间的“交换”或转置(其中一个是空白)。

因为拼图以右下方的空白区块开始和结束,所以空白区块必须移动偶数次才能解决拼图。 (通过在拼图上方想象一个重叠的棋盘图案,这是最容易看到的 - 在奇数次移动之后,空白将位于不同的颜色方块上。)这意味着所制定的解决方案必须是均匀多次排列的产品,所以它必须是交替的组A 16 的一个元素,它恰好有一半的S 16 。 (在S 16 的16个排列中,16!/ 2个排列是偶数,16!/ 2是奇数。此外,偶数*偶数=偶数,偶数*奇数=奇数,奇数*奇数=偶数。)

如果必要的纠正排列恰好是奇怪的,那么无论你做什么,都无法解决这个难题。如果必要的校正排列是偶数,并且如果Axarydax遵循所描述的策略,那么剩余的2x2块所需的排列必然是固定空白方块的偶数排列。仅三个元素的唯一偶数排列是旋转1-> 2-> 3-> 1(循环符号(123))和1-> 3-> 2-> 1(循环符号(132) ))。这些很容易在剩下的四个方格上进行而不会打扰其他方格。

由于Axarydax无法弄清楚2x2区块的这些微不足道的解决方案令人难以置信,我怀疑他/她是恶作剧,或者尝试的15个难题在某种程度上是非标准的。

答案 6 :(得分:0)

任何给定的位置总共最多有4个移动位置。我想知道构建2-4树的所有选项的简单算法是否会达到“已解决”位置或堆栈溢出:)