数码的可达问题——八数码的一些想法
数码的可达问题——8数码的推广
一个经典的问题:8数码
有一个3*3的九宫格,每格填有一个数0到8的数,互不相同。
填的数为0的格子可以和相邻的格子交换数。
给定九宫格的两种状态a,b,
问能否通过一组交换使得a状态变成b状态。
这个问题的标准解法是:把两个状态中的数(除0外)线性地排列出来并且分别求其
逆序对数,若两个逆序对数的奇偶性相同,那么a,b相互可达。
这个做法相当优美,但是它只是利用了这类问题的某个性质,究竟是什么性质呢?
首先考虑一个2*2的棋盘
容易发现,交换操作过后,只可能是当前状态的某个轮换。
以此为基础,可以用数学归纳法得到一个结论:
在任一 N*M的格子中,取任意三个非0的数,可以有一组交换操作使得
他们的位置产生轮换,而其它的数位置不变。
基于这个观察(事实上我觉得比之前的那个结论范围要广一点),可以得到一个不弱于
求逆序对数的算法。
1.把两个状态中的数按顺序排成一个一位数组,
2.删去其中位置已经相同了的数
3.在剩下的数组1中,任找一个数A,若A在数组2中出现的位置为a,那么选取另外两个数
B,C,其中B在数组1中的位置为b,C任意,对 A,B,C三个数执行一次轮换
4.重复步骤2,3,直到数组中的元素个数为3
5.元素个数为3的时候很容易判断是否可达。
由于这个条件更本质,所以理所应当地可以推广到更多的场合中