汉诺塔问题

什么是汉诺塔

  • 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。有三个金刚石塔,第一个从小到大摞着64片黄金圆盘。现在把圆盘按大小顺序重新摆放在最后一个塔上。并且规定,在小圆盘上不能放大圆盘,在三个塔之间一次只能移动一个圆盘。
    在这里插入图片描述

  • 也就是说需要将A上的圆盘全部移动到C上,并且要保证小圆盘始终在大圆盘上。

实现方式

首先,我们可以先列出前几种结果
1.当圆盘个数为1时

  • 第1个圆盘直接从A—>C

2.当圆盘的个数为2时

  • 第1个圆盘从 A—>B
  • 第2个圆盘从 A—>C
  • 第1个圆盘从 B—>C

3.当圆盘的个数为3时

  • 第1个圆盘从 A—>C

  • 第2个圆盘从 A—>B

  • 第1个圆盘从 C—>B

  • 第3个圆盘从 A—>C

  • 第1个圆盘从 B—>A

  • 第2个圆盘从 B—>C

  • 第1个圆盘从 A—>C

然后我们不难发现,由从A—>C这一步骤我们就可以将整个过程划分为三个部分

1.中间的上一步 ----- 把n-1个盘子由A 移到 B
2.中间一步 ----- 把第n个盘子由 A移到 C
3.中间的下一步 ----- 把n-1个盘子由B 移到 C

代码实现:

public class HanoiTest {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入圆盘的个数:");
        int num = scanner.nextInt();
        char start = 'A';
        char middle = 'B';
        char end = 'C';
        HanoiTest.hanoi(num,start,middle,end);
    }
    //count的作用是记录移动的次数
    public static int count;
    public static void move(int disk, char start, char end){
        System.out.println("第" + (++count) + "次移动,将" + disk +"号圆盘从" + start + "移动到" + end);
    }
    public static void hanoi(int n, char A, char B, char C){
        if (n == 1){//圆盘只有一个的话,直接从A移到C
            move(1, A, C);//也就是将第一个盘子移动到C上
        }else{
            //整个过程可分为三部分
            //1.先将n-1个盘子通过C移动到B上
            hanoi(n - 1, A, C, B);
            //2.将第n个盘子直接从A移动到C上
            move(n, A, C);//中间阶段,
            //3.将移动到B上的盘子通过A移动到C上
            hanoi(n - 1, B, A, C);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值