“小和尚的游戏”- -汉诺塔

相传山上有个庙,庙里有个小和尚和老和尚。一天小徒弟闲来无事,就去找老和尚,问有没有什么可以锻炼智力的游戏,老和尚就给小和尚准备了三根柱子,说:首先第一根柱子上只有一个碗,你吧这个碗挪到第三个柱子上,小和尚很轻松的就完成了;然后老和尚又在第一根柱子上放了三个碗,而且这三个碗是按从小到大依次放,他这次要求小和尚把这三个碗从第一根柱子挪到第三根柱子上,但是挪动的过程中得保证小碗在大碗之上,且每次只能移动一个碗,小和尚思索片刻后,完成了目标;但是最后老和尚说我要是给你64个碗呢? 小和尚陷入了思考。聪明的你知道怎么做嘛?

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

1、挪一个盘子: (1步)

在这里插入图片描述
小朋友都知道的,当然是直接放过去就好了 A - - > C

在这里插入图片描述

2、挪两个盘子:(3步)

在这里插入图片描述
A1- - > B , A2 - - > C :

在这里插入图片描述
A1 - - > C :
在这里插入图片描述
3、挪三个盘子: (7步)
在这里插入图片描述
A1 - - > C , A2 - - > B :
在这里插入图片描述
A1 - - > B , A3 - - > C :
在这里插入图片描述
A1 - - > A , A2 - - > C , A1 - - > C
在这里插入图片描述
我们总结以上的规律

挪一个盘子: 1步 = 2^1 - 1
挪两个盘子: 3步 = 2^2 - 1
挪三个盘子: 7步 = 2^3 - 1

挪64个盘子: 2^64 - 1

我们简单计算一下,计算机运行64个盘子得运行将近 300 年左右
所以我们简单的输出一下1、2、3个盘子的结果

package test24;

public class testDemo {
    
    
    public static void move (char pos1,char pos2) {
    
    
        System.out.print(pos1+" --> "+pos2+" ");//模仿鼠标的移动
    }
    /**
     *
     * @param n       代表盘子的数目
     * @param pos1    代表第一根柱子  A
     * @param pos2    代表第二根柱子  B
     * @param pos3    代表第三根柱子  C
     */
    public static void HanoiTower (int n,char pos1,char pos2,char pos3) {
    
      //n代表盘子的数目
        if(n == 1) {
    
    
            move(pos1,pos3);
        } else {
    
    
            HanoiTower(n-1,pos1,pos3,pos2);   // pos1 上的东西通过 pos3 传到 pos2 上
            move(pos1,pos3);
            HanoiTower(n-1,pos2,pos1,pos3);
        }
    }
    public static void main(String[] args) {
    
    
        HanoiTower(1,'A','B','C');
        System.out.println();
        HanoiTower(2,'A','B','C');
        System.out.println();
        HanoiTower(3,'A','B','C');
        System.out.println();
    }

}

运行结果:
在这里插入图片描述

小伙伴想尝试 64 个盘子的,可以自己试试哦!!!

猜你喜欢

转载自blog.csdn.net/qq_45658339/article/details/108876299