【Java笔记】汉诺塔问题

一、什么是汉诺塔?

汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

二、分析:用递归求解汉诺塔问题(Java)

2.1 情况一:只有 1 个圆盘

如图:
挪动前:
在这里插入图片描述

挪动过程: 这种情况非常简单,只需要直接把圆盘从起始位置 A 挪动到目的位置 C 即可!
挪动后:
在这里插入图片描述

过程:A->C

2.2 情况二:有 2 个圆盘

如图:
挪动前:
在这里插入图片描述
挪动过程:
我们需要先把绿色圆盘挪到 B
在这里插入图片描述
再将红色圆盘挪到 C
在这里插入图片描述
最后再将绿色圆盘挪到 C
在这里插入图片描述
过程:A->B A->C B->C

2.3 情况三:有 3 个圆盘

如图:
挪动前:
在这里插入图片描述
挪动过程:
先把蓝色圆盘挪到 C
在这里插入图片描述
再将绿色圆盘挪到 B
在这里插入图片描述
再将蓝色圆盘挪到 B
在这里插入图片描述
将红色圆盘挪到 C
在这里插入图片描述
将蓝色圆盘挪到 A
在这里插入图片描述
将绿色圆盘挪到 C
在这里插入图片描述

将蓝色圆盘挪到 C
在这里插入图片描述
过程:A->C A->B C->B A->C B->A B->C A->C

2.4 有 n 个圆盘

这里以 4 个圆盘为例,4个盘子画图是比较困难的,但我们可以采用一种大事化小的方法解决
挪动前:
在这里插入图片描述
通过上边例子我们可以知道,除了最下边的圆盘,其他的盘子都是通过B,再挪到C的,因此n个盘子,我们也是要把上边 n-1 个盘子先挪到B,如图:
在这里插入图片描述
之后我们就可以将红色的盘子直接挪到C了,剩下在B柱子上的盘子和上边的例子一样,都是通过A柱最后移动到C柱上,这就是大事化小的思想!

三、代码的实现

public class TowerOfHanoi {

    //打印过程
    public static void move(char pos1, char pos2) {
        System.out.print(" " + pos1 + "->" + pos2 +" ");
    }

    /**
     * @param n     盘子数量
     * @param pos1  起始位置
     * @param pos2  中转位置
     * @param pos3  目标位置
     */
    public static void hanoi(int n, char pos1, char pos2, char pos3) {
        if (n == 1) {
            move(pos1, pos3);
        } else {
            hanoi(n - 1, pos1, pos3, pos2);
            move(pos1, pos3);
            hanoi(n - 1, pos2, pos1, pos3);
        }
    }

    public static void main(String[] args) {
        hanoi(3,'A','B','C');
    }
}

以3个盘子为例子,输出结果就是:

在这里插入图片描述

和我们上边分析的结果一样!
那么4个盘子呢?结果就是

在这里插入图片描述

可以说手动挪起来是比较复杂了,但通过计算机我们可以很快的得出结果,要注意的是,盘子数量越多,计算机运行的时间也会越长!!!

以上就是汉诺塔问题的全部内容了,如果有问题欢迎私信!!!
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值