奇数码问题初探
最近在算法竞赛进阶指南上看到了奇数码问题,但是没讲证明。恰好最近刻上老师讲了证明,简单记录一下证明过程。证明过程需要用到映射和基本的群论知识,如果你不了解,建议先学习一下这些前置知识。本文中的复合运算符
题目简介
奇数码问题是一个经典的群论问题。也许你听说过数字华容道或
可解性
赏金
1896 年,美国著名棋手SamLoyd 曾经悬赏1000
美金,来看看有没有人可以解出这个问题:你可以自己玩玩看,看看你能不你拿到这1000美元
对换,置换与轮换
在解决这个问题前,我们先引入几个概念。
- 置换,又叫排列,指的是在集合
中的双射 。例如,对于 ,定义 , 就是一个置换。实际上,如果用 替换 ,会发现其实集合里面每个数都出现了,只是顺序可能不同。就像这样 刚刚这种表示也可以用来记录一个置换。即 特别的,对于 这种映射也是置换,成为恒同变换或者叫恒同置换,记作 。
- 对换,顾名思义,就是只有两个元素进行了交换,其他元素不变。形式化的,
是对换是指存在 ,并且对于其他元素 ,我们可以用 来表示这是一个交换 的对换。假设 ,我们可以用 来表示一个对换,它的涵义就等于 - 轮换,就是指几个元素轮流交换。形式化的,就是对于若干的元素
, 我们用 来表示这个轮换。举个例子,假设 , 就是指这个置换 其中有一些结论并不是本文的重点,在下文会直接使用,建议先了解一下相关知识。
可解性判定
我们先来讨论
奇变换与偶变换
我们建立一个初始状态(
考虑我们有什么操作可以进行,由于最终空格一定要回到原处,因此一来一回有两次路径,共有偶数次上下或左右对换,因此这个置换是偶置换就是可解的必要条件。但是开头的谜题指交换了
轮换
不同与前一章的建模方法,这次的映射不算空格,只有
考虑在这个问题之中到底有什么操作可以进行。首先,对于这样的四个格子,可以让空格转一圈来使三个元素进行轮换。
然后,我们可以通过将空格移到任意一个位置,在像上面一样进行轮换,接着原路返回,就可以在任意位置实现像这样的三轮换了。
那么,我们只要使用轮换来实现对换的效果就可以了。实现的方法如下:
- 对于四个不同的元素
,
- 对于三个不同的元素
,
由于 为偶,因此 的逆也为偶。因此,我们只要思考如何实现任何三个元素的轮换就可以了。
这也是可以实现的。首先,我们需要了解置换对轮换的共轭是什么样的。假设
我们先来讨论
接下来考虑
最后,就是任意三个元素
扩展
上面的两种方法很容易扩展到
逆序对
考虑轮换方法。首先我们考虑只是用临项交换来将解决问题。所需要的置换次数其实就是序列的逆序对个数。由于这种只用临项交换的方法和其它使用对换的方法都是
空格
如果空格不在最右下角怎么办?考虑将空格移到右下角的过程。我们已经知道可解性和逆序对的关系了,因此我们只要注意逆序对个数就可以了。左右移动空格并不会改变逆序对个数,而像下移动空格会使逆序对发生变化。由于一个数和空格交换,到了
换句话将,这个操作对逆序对产生的影响和这
任意两个状态是否可达
实际上,通过上面两种方法我们可以了解到,任意两个状态分别记作
这个问题的推广实际上也不是很难,只需要将上面两个问题的