前几天ACM培训的时候做到关于拼图的题目,于是结合网上的说法,以及玩拼图的经验,开始了一系列研究。

SGU139:Help Needed(拼图)​


一,链接

​4399拼图游戏​


二,游戏规则

给你一个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为偶,所以这个状态肯定无法复原。

有的状态是可以复原的,比如

拼图游戏——策略与判定_逆序数_02

这个状态的逆序数为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的奇偶性相同时,可以复原。

至此,关于拼图的研究就告一段落了,谢谢观看!