前几天ACM培训的时候做到关于拼图的题目,于是结合网上的说法,以及玩拼图的经验,开始了一系列研究。
SGU139:Help Needed(拼图)
一,链接
二,游戏规则
给你一个n(n>1)行m(m>1)列的矩阵,刚好由0,1,2。。。。。。n*m-1这n*m个数组成。
通过一系列的操作,使得矩阵变成如下状态(以下简称复原状态):
按照从上到下(一级排序),从左到右(二级排序)来排序,矩阵可以排成数列1,2,3,4。。。。。。n*m-2,n*m-1,0
操作只有1种,0和0的若干邻居(上下左右,最多4个邻居)中的某一个交换位置。
拼图游戏里面,0对应的格子是空的。
三,术语
逆序:
对于n个不同的元素,先规定个元素之间有一个“标准次序”(例如n个不同的自然数,可规定由小到大为标准次序),于是在这n个元素的任一排列中,当某两个元素的先后次序与标准次序不同时,就有1个“逆序”。点击打开百科词条
逆序数:
一个排列中所有逆序的总数叫做这个排列的“逆序数”。点击打开百科词条
曼哈顿距离:
固定直角坐标系上两点所形成的线段对轴产生的投影的距离总和。点击打开百科词条
总状态数:
逆序数是数列的一种状态数,曼哈顿距离是线段的一种状态数。
同样的,对于如上所说的n*m的矩阵,也可以定义总状态数。
总状态数=逆序数+0所在的格子到右下角的格子的曼哈顿距离(以下简称曼哈顿距离)。
四,总状态数奇偶不变定理
对于一个序列,每交换任意2个数,逆序数的奇偶性都会改变1次。
对于拼图游戏,每交换一次,曼哈顿距离的值都加1或者减1,所以奇偶性也会改变1次。
所以说,对于拼图游戏,总状态数的奇偶性是永远不变的。
五,判定——必要性
任何1个n*m的矩阵,是否都能移成复原状态呢?不一定。
首先,复原状态的总状态数的奇偶性可以算出来,曼哈顿距离为0,逆序数为n*m-1
所以总状态数的奇偶性就是n*m-1的奇偶性。
那么,对于任意给定的矩阵,很明显有的状态的奇偶性符合,有的却不符合。
根据总状态数奇偶不变定理,奇偶性不对的肯定无法复原,比如
这个状态的逆序数为15,曼哈顿距离为0,所以这个状态为奇,
而总状态数的奇偶性是3*5-1=14为偶,所以这个状态肯定无法复原。
有的状态是可以复原的,比如
这个状态的逆序数为14,曼哈顿距离为4,和为偶,经验证,这个状态是可以复原的。
说起来,这2个图就是上面的链接里面的4399游戏截图的,因为初始化比较慢,
而且还没初始化完就可以开始点了,于是我侥幸能得到这2张图。
那么,是不是只要状态的奇偶性对了,就一定可以复原呢?
这个值得思考,请继续看!
六,极小化
对于2*2的拼图,只有4!=24种状态。n=2,m=2,n*m-1=3
可以验证,有12种奇状态,全部可以复原,有12种偶状态,全部无法复原。
七,策略(化为子问题)
对于假设可以复原的状态,要怎么样复原呢?
第一,若 n>2,那么一定可以复原第一行,接下来只需要解决(n-1)*m 的子问题。
请注意,既然是子问题,那么第一行当然是永不再变,下同。
还请注意,因为加了这个限制,原问题有解不代表子问题同样有解。
第二,若m>2,那么一定可以复原第一列,接下来只需要解决 n*(m-1)的子问题。
第三,通过反复运用上述2条结论,最终一定可以只剩下右下角的4个格子,即2*2的子问题。
八,判定——充分性
如果一个状态的奇偶性和n*m-1的奇偶性相同,那么通过上述策略(七)化成2*2的子问题之后,
得到的状态的奇偶性和n*m-1的奇偶性仍然相同(四)。
根据(六),一定可以复原。
综上所述,当且仅当一个状态的奇偶性和n*m-1的奇偶性相同时,可以复原。
至此,关于拼图的研究就告一段落了,谢谢观看!