数码的可达问题——八数码的一些想法

     数码的可达问题——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的时候很容易判断是否可达。

 

由于这个条件更本质,所以理所应当地可以推广到更多的场合中

 

posted @ 2012-02-28 11:56  zhouyichi  阅读(502)  评论(0编辑  收藏  举报