如图1(其中一种初态),一个4×4的棋盘,上面有1~15共15个数字和一个空格(用◎表示),要求利用空格移动棋子把他们排成图2的形式(目标状态)。
10 1 11 14 1 2 3 4
2 3 ◎ 5 5 6 7 8
8 9 4 15 9 10 11 12
12 13 6 7 13 14 15 ◎
(图1) (图2)
问题:
现有一函数f(x),x表示格子的编号(编号与图2类似,◎处为16号),f(x)的值表示从第x+1格到第16格中,较x格中的棋子的号码小的棋子个数。例如,图1中,第8格的棋子是5,故f(8)=1,同理f(14)=2。对于空格◎,定义为比任何棋子都大,如图1中f(7)=9。又如,图2中,f(1)=f(2)=...=f(16)=0。
设空格位于棋盘上第i行第j列(如图1,i=2,j=3)。
求证:
对于一个给定的初态,如果:
16
∑f(x)+i+j
x=1
和是偶数,则该初态可变换成目标状态,否则,其他任何初态都不可能变换成目标状态。
///
结论0:
若某种初态能够变换为图2的排列,则∑f(x)+i+j 是偶数。
证明:
考虑空格◎朝上、下、左、右四个方向移动的时候∑f(x)+i+j的变化量:
左、右:变化量为0;
上:设◎的格号为k,格号为k-1,k-2,k-3的格子中有m个数大于格子k-4中的数,
则此时的变化量等于2*m;
下:设◎的格号为k,格号为k+1,k+2,k+3的格子中有m个数大于格子k+4中的数,
则此时的变化量等于-2*m;
每种情况变化量都是偶数。
由于最终的目标状态的∑f(x)+i+j=8是偶数,所以结论0成立。
结论1:
在下面的2X3表格中i,j可以互换位置,其中◎可在任意一个x处。
i | x | x |
j | x | ◎ |
证明:
i | x | x |
j | x | ◎ |
==>
i | ◎ | x |
j | x | x |
==>
j | i | x |
◎ | x | x |
==>
◎ | j | x |
x | i | x |
==>
x | j | x |
i | ◎ | x |
==>
x | ◎ | j |
i | x | x |
==>
x | i | j |
x | ◎ | x |
==>
◎ | i | j |
x | x | x |
==>
j | ◎ | x |
i | x | x |
得证!
由结论1,便可以得到:
结论2:
在2X3的表格中,任意两个数都可以按指定顺序移到边上的两个格中。
证明:
1.若这两个数在表中相邻,则首先利用空格子将它们拉到边上,如果顺序正确,即为所求;若不正确,利用结论1,调换位置。
2.若这两个数在表中不相邻,则首先利用空格子让它们相邻,然后同上。
结论3:
对于4X4的表格,通过适当的移动,肯定能得到下列两种结果状态之一:
(1).
1 | 2 | 3 | 4 |
5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 |
13 | 14 | 15 | ◎ |
(2).
1 | 2 | 3 | 4 |
5 | 6 | 7 | 8 |
9 | 10 | 11 | 15 |
13 | 14 | 12 | ◎ |
其中(1)的∑f(x)+i+j =8是偶数;(2)的∑f(x)+i+j =13是奇数。
证明:
依靠结论2,对于任何一个初态排列,我们可以依次将下列数对放到正确位置:
(1,2),(3,4),(5,6),(7,8),(9,13),(10,14),最后将11移到正确位置,◎移到角上,则必得到如结论中所述的两种状态之一,根据结论0,(2)不可能变换为(1)。由此可知若初态的∑f(x)+i+j是偶数,则它能够且只能变换成为(1);而若初态的∑f(x)+i+j是奇数,则它能够且只能变换成为(2)。
上面给出的移动方法,显然是一种机械步骤,喜欢软件编程的朋友可以一试身手,编好了,别忘了告诉大家。
<script type="text/javascript"> google_ad_client = "pub-2416224910262877"; google_ad_width = 728; google_ad_height = 90; google_ad_format = "728x90_as"; google_ad_channel = ""; google_color_border = "E1771E"; google_color_bg = "FFFFFF"; google_color_link = "0000FF"; google_color_text = "000000"; google_color_url = "008000"; </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>