我们平常所见的拼图游戏是一堆被打乱的图片碎片,我们要做的就是通过有限的步骤把它们还原为一个完整的图片。
其实我们可以将每一个图片碎片看作一个个数字模块,拼好的拼图的数字模块是按照数字的次序排列的。
那么我们的拼图游戏其实就是将打乱的数字阵列通过一定的步骤转换为有顺序的阵列。
这个就是所谓的n-puzzle问题,常见的有8puzzle(九宫)和15puzzle(十五迷),其实就是还原33和44拼图嘛。
今天我所要介绍的是关于n puzzle问题的可解性的判断;
我们看如下矩阵:
12 01 10 02
07 11 04 14
05 xx 09 15
08 13 06 03
我们将这个矩阵写成一维数组:
A={12,1,10,2,7,11,4,14,5,xx,9,15,8,13,6,3};
接下来,我们定义一个Ti表示位于数组A中在第i位后,比Ai小的元素的个数,不包括xx;
那么我们依据上述描述,又可以写出一个序列:
B=[11,0,8,0,4,6,1,6,1,3,4,2,2,1]
然后求他们的和:sumB=49;
那么判断是否这个十五迷问题是否有解的依据有下面两条:
1.如果序列A的宽度为奇数,那么每个可解的问题所定义的sumB必须是偶数。
2.如果序列A的宽度为偶数,那么当空格xx位于从下往上数的奇数行中时,sumB必须为偶数,
当空格xx位于从下往上数的偶数行中时,sumB必须为奇数。
对于证明,大家可以看这里:
十五迷问题http://blog.csdn.net/mindhawk/article/details/1445013;
代码很简单,我就不往这里写了。