基于汇编实现的九连环递归算法及其拓展

资源下载地址:https://download.csdn.net/download/sheziqiong/85683155
资源下载地址:https://download.csdn.net/download/sheziqiong/85683155

九连环递归算法及其拓展

1 九连环简介


九连环是中国最杰出的益智游戏。长期以来,这个益智游戏是数学家及现代的电子计算机专家们用于教学研究的课题和例子。

九连环以金属丝制成9个圆环,将圆环套装在横板或各式框架上,并贯以环柄。把玩时,按照一定的程序反复操作,可使9个圆环分别解开,或合二为一。从完整状态解下所有九个环一般需要解341步。

2 九连环规则

在解九连环的过程中间,只有两个规则可循。并且这两个规则在游戏中交替使用:

规则一:第一环可以在任何时候放上或取下环柄。

规则二:只有紧跟在领头环后的环可以放上或取下环柄。(领头环是套在柄上的最前面的环)

如果所有的环都在柄上,那么第一步可以有两个选择。(根据规则一,取下第一环;或者根据规则二,取下第二环。)但是,走完第一步以后,我们只需要交替使用这两个规则,就不会走回头路。

当环数是奇数时,第一步必须是要将第一环取下(规则一)。要解是偶数的连环时,第一步则是要将第二环取下(规则二)。取下一个环就是要将这个环滑过柄尖并从柄中由上而下滑下。放上一个环就是要将这个环由下而上穿过柄中,再滑过柄尖放入柄上。

3 九连环递归描述

(1)第 1 环可以自由上下
(2)而上/下第 n(n>1) 环时,则必须满足:
    (a)第 n-1 个环在架上
    (b)前 n-2 个环全部在架下

4 九连环拆解安装过程


正确的拆解是先以第 9 环为目标,先拆下它,简化为拆一个 8 连环。接着再也第 8 环为目标,拆下它,简化为拆一个 7 连环。以此类推,直至全部拆解。

其实安装和拆解是一个道理,因为他们均是使用上面说的规律来完成的。

正确是安装也是先以第 9 环为目标,先装上它,简化为装一个 8 连环。接着再也第 8 环为目标,装上它,简化为装一个 7 连环。以此类推,直至全部安装。

实践中,我们会进一步发现一个简单规律,当安装上第 9 环后,问题可以被简化为装一个 7 连环,而当装上第 7 环后,问题就被简化为装一个 5 连环了。

5 求解九连环及相关问题

5.1 拆解/安装 n 连环

5.1.1 问题描述

输入一个正整数 n ,输出 n 连环的拆解和安装步骤,以及相应步骤数。

5.1.2 编程思路

递归实现问题求解。

拆解 n 连环,首先在第 n-1 在轴上的前提下卸下第 n 环前需要将前 n-2 环全部卸下,然后才能卸下第 n 环,之后装上前 n-2 环,此时已经简化为拆解 n-1 连环问题,开始拆解 n-1 连环,步骤同 n 连环。

安装 n 连环,首先在安装第 n 环前需要先将第 n-1 环装上以及卸下前 n-2 环,之后才能装上第 n 环,此时可以直接简化为安装 n-2 连环问题,开始安装 n-2 连环,步骤同 n 连环。

以此类推,实现递归。

5.1.4 程序演示


5.2 拆解/安装任意状态九连环

5.2.1 问题描述

九连环共有 9 位在轴上和在轴下可以分别用 1 和 0 表示,那么九连环可能的状态共有 2^9=512 种。

输入一个九连环的当前状态( 9 位 01 串表示),输出此状态下的九连环的最快解法和最快装法,以及相应步数。

5.2.2 编程思路

编程思路与前面 5.1 类似,但并不完全相同。也是递归实现,但是要考虑其中状态的问题,并不是像 5.1 中完整的 n 连环那样容易。

首先简化问题难度,如果是拆解九连环则从最后一个在轴上的环开始向前解,同理,安装九连环从最后一个不在轴上的环开始向前装,这样会省去一些递归。

拆解第 n 环,首先检查,如果当前环在轴上,则跳过,开始拆解前一个环,重复此步骤;接着如果第 n-1 环在下,需要上第 n-1 环,然后下 第 n-2 环,之后下第 n 环;第 n 环拆下后,需要将之前卸下的第 n-2 环装上,再下第 n-1 环,重复回第一步;

安装第 n 环,首先如果第 n-1 环在下,需要上第 n-1 环,然后下 第 n-2 环,之后上第 n 环; 第 n 环安装后,需要将之前卸下的第 n-2 环装上(如果在上则不需,因为可能第 n 环也在上跳过之前一步),再上第 n-2 环,重复回第一步;

重复递归实现。

5.2.4 程序演示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p2poswJD-1655538267638)(https://www.writebug.com/myres/static/uploads/2021/10/31/7dfab684174aff1221e53a9b2a70f6bd.writebug)]


在这里插入图片描述

6 九连环问题拓展延伸——连环锁与格雷码

6.1 九连环与格雷码的关系

智力玩具九连环的状态 变化符合格雷码的编码规律,汉诺塔的解法也与格雷码有关。

九连环中的每个环都有上下两种状态,如果把这两种状态用0/1来表示的话,这个状态序列就会形成一种循环二进制编码(格雷码)的序列。所以解决九连环问题所需要的状态变化数就是格雷码111111111所对应的十进制数341。

6.2 问题描述

你现在要操作的是一个n连环,n为正整数,给出n连环的两种状态,计算出从第一种状态变换到第二种状态所需要的最少步数。

输入:第一行是一个正整数m,表示有m组测试数据。
每组测试数据一共3行,第一行是一个正整数n (0 < n < 128),后两行每一行描述一种状态,n个数(0或1),用空格隔开。

输出:对于每一组测试数据输出一行,一个非负整数,表示从第一种状态变换到第二种状态所需要的最少步数。

6.3 编程思路

将输入的两种状态当初格雷码转换成二进制再转成十进制,最后两个十进制的差的绝对值就是结果。

6.4 转换规则

二进制码->格雷码:从最右边一位起,依次将每一位与左边一位异或,作为对应格雷码该位的值,最左边一位不变;

格雷码->二进制码:从左边第二位起,将每位与左边的所有值异或,作为该位解码后的值(最左边一位依然不变)。

6.5 编程实现

此处只简单实现了格雷码与二进制码的转换。

int toGray(int x)
{// 转化为格雷码  
    return x^(x>>1);  
}  
int toBinary(int x)
{// 格雷码转化为二进制  
    int y = x;  
    while(x>>=1){  
        y ^= x;  
    }  
    return y;  
}  

资源下载地址:https://download.csdn.net/download/sheziqiong/85683155
资源下载地址:https://download.csdn.net/download/sheziqiong/85683155

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值