八数码问题有解条件&推广N×N,N×N×N

来源:互联网 发布:c语言怎么产生随机数 编辑:程序博客网 时间:2024/05/18 01:45

对于简单的八数码(3*3)

一般的目标状态是这样的(我们把矩阵表示为序列,0表示空格):
1 2 3
4 5 6
7 8 0
即:
123456780

对于每个状态定义一个逆序:除0以外的数字的逆序对数目

抛出结论:两个状态可以达,当且仅当两个状态序列逆序奇偶性相同

简单证明必要性:
对于空格的移动,左右移动不会影响逆序,上下移动导致被替换数字跨过两个数字,这两个数字可能都比它大,可能都比它小,可能一大一下,相应的对逆序造成的影响为:+2,-2,不变。因此得证。

对于N*N的矩阵

容易发现,N为奇数的时候与八数码问题相同

那么对于偶数:
譬如:N=4的时候:
对于空格的移动,左右移动不会影响逆序,上下移动导致被替换数字跨过3个数字,对逆序造成的影响为:+3,-3,+1,,-1。我们发现,奇偶性一定改变,不一定有解也不一定无解。

举个例子:
目标状态:
1 2 3 4
5 6 7 8
9 A B C
D E F 0

状态1(无解):
1 2 3 4
5 6 7 8
9 A B 0
C D E F

以上状态是一个无解的状态(将C移到了第四行)。该状态的逆序为0,和原始状态相同,但是它的空格位置在第三行。若将空格移到第四行,必然使得它的逆序±1或±3,奇偶性必然改变。所以它是一个无解的状态。

然而以下状态就是一个有解的状态(交换了前两个数字1 2):

状态2(有解):
2 1 3 4
5 6 7 8
9 A B 0
C D E F

这个状态的逆序为1,和原始状态奇偶性不同,而空格位置在第三行。由于空格每从第三行移动到第四行,奇偶性改变。则该状态的可到达原始状态。

通过观察发现,得出结论:
1.N×N的棋盘,N为奇数时,与八数码问题相同。

2.N为偶数时,空格每上下移动一次,奇偶性改变。称空格位置所在的行到目标空格所在的行步数为空格的距离(不计左右距离),若两个状态的可相互到达,则有两个状态的逆序奇偶性相同且空格距离为偶数,或者,逆序奇偶性不同且空格距离为奇数数。否则不能。

也就是说,当此表达式成立时,两个状态可相互到达:(状态1的逆序数 + 空格距离)的奇偶性==状态2奇偶性

对于N*N*N矩阵

三维的结论和二维的结论是一样的。

考虑左右移动空格,逆序不变;同一层上下移动空格,跨过N-1个格子;上下层移动空格,跨过N^2-1个格子。

当N为奇数时,N-1和N^2-1均为偶数,也就是任意移动空格逆序奇偶性不变。那么逆序奇偶性相同的两个状态可相互到达。

当N为偶数时,N-1和N^2-1均为奇数,也就是令空格位置到目标状态空格位置的y z方向的距离之和,称为空格距离。若空格距离为偶数,两个逆序奇偶性相同的状态可相互到达;若空格距离为奇数,两个逆序奇偶性不同的状态可相互到达。

原创粉丝点击