汉诺塔问题详解

   首先解决汉诺塔问题我们需要知道什么是汉诺塔。

如图:


  通过图片我们知道汉诺塔,其实就是将A柱上面的盘子,借助B柱子移动上C柱上。

由此,我们对于这个问题可以通过递归方法来实现,那么怎么递归呢。

我们假设一个简单的,

当A柱上有2个盘子时,其步数为:

   A -> B , A -> C , B -> C。总共3步

当A柱上有3个盘子时,其步数为:

   A -> C , A -> B , C -> B , A -> C , B -> A , B ->C , A -> C。总共7步


通过以上规律我们可以发现,都是要先把A柱最后一个盘子上的所有盘子先移到B柱上面,把最后一个盘子放在C盘子上,然后再把B柱上的盘子放到C上。

假设: A柱上有n个盘子,

 1.  我们需要先把A柱上的 n-1 个盘子放到B柱上,然后把最后A柱上的最后一个盘子放到C柱上。

 2.  此时B柱上有 n-1 个盘子,然后把B柱上,最后一个盘子上 n-2 个盘子放到A柱上,然后把B柱的盘子放到C柱上。

3.  经过两次交换我们发现我们已经把原来A柱子上,最后两个盘子依次放到了C盘子上,此时的A柱上,有 n-2 个盘子。我们发现此时和之前的一样,依次递归就可以实现。


汉诺塔图解:

这里是假设的第一步,第二步可以自己尝试画画更好理解。


代码:

import java.util.Scanner;
public class Main {
    static int count = 0;//定义一个全局变量,用来统计个数。

    public static void move(char pos1, char pos2){
        System.out.print(pos1 + "->" + pos2 + " ");//打印移动去向。
        count++;//移动次数加一。
    }
    public static void hanoi(int x, char pos1, char pos2, char pos3){
        if(x == 1){
            move(pos1 , pos3);//移动最后一次终止,开始回归。
            return;
        }
        hanoi(x-1 , pos1 , pos3 , pos2);//从A柱借助C柱行动上B柱。
        move(pos1 , pos3);
        hanoi(x-1 , pos2 , pos1 , pos3);//从B柱借助A柱行动上C柱。
    }


    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        hanoi(n , 'A' , 'B' , 'C');
        System.out.println();
        System.out.print(count);//打印移动总次数
    }
}

  A柱上3个盘子打印。

A柱7个盘子打印。


总结:

这里我们是以某个盘子上的最后一个盘子,为参照,借助其中一个盘子,将最后一个盘子移动到目标盘子。代码中 hanoi函数 就是根据这个来传参的。


这里就是汉诺塔问题的详解。

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值