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

本文深入探讨了8数码问题的可达性,并提出了基于轮换操作的算法,相较于传统逆序对数方法,该算法更为本质且具有更广泛的适用性。详细介绍了算法的步骤与实现逻辑,同时阐述了其在不同大小棋盘上的应用。

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

 

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

 

转载于:https://www.cnblogs.com/njuzyc/archive/2012/02/28/2371298.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值