1-6 汉诺塔问题的改进

题目描述

  • 汉诺塔问题的改进。
  • 有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆: 每次只能移动一个圆盘; 大盘不能叠在小盘上面。 提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须遵循上述两条规则。问具体应该怎样移动。
  • 以上是经典的汉诺塔问题,现在修改一下移动的规则,不能从a塔直接移动到c塔,也不能直接从c塔直接移动到a塔,而是必须要经过中间的b塔。打印最优移动步数,以及最优移动总步数。

解题方法1

  • 使用递归的方法解决。
  • 如果只剩一个盘子需要移动,可以分两种情况讨论:
    从塔a移动到塔b只需要一步,直接 a >> b 即可。从b到a,从b到c,从c到b同理只需要一步。
    从塔a移动到塔c需要两步, a >> b and b >> c。同理从c到a也需要两步。
  • 如果还剩k个盘子需要移动,仍然分两种情况讨论:
    把k个盘子从塔a移动到塔b,需要三步,把前k-1个盘子从a移到c(交给递归),把第k个盘子从a移到b,把前k-1个盘子从c移到b(交给递归)。对于把k个盘子从b到a,从b到c,从c到b同理需要三步。
    把k个盘子从a移到c,需要五步,把前k-1个盘子从a移到c,把第k个盘子从a移到b,把前k-1个盘子从c移到a,把第k个盘子从b移到c,把前k个盘子从a移到c。对于把k个盘子从c移到a同理需要五步。
  • 代码如下:(设盘子从上到下命名为1-n)
public class Test {
   
    public static void main(String[] args) {
   
        hannuo(2,'a','b','c');
    }
    //参数1:盘子个数
    //参数2:源塔
    //参数3:中间塔
    //参数4:目标塔
    public static void hannuo(int n,char from,char mid,char to){
   
         if(n==1){
   
             //移动两步的情况
             if((from=='a' && to=='c') || (from=='c' && to=='a')){
   
                 System.out.println("盘子"+n+":"+from +" >> " + mid);
                 System.out.println(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值