Java 实现一个汉诺塔实战练习

 更新时间:2021年10月25日 14:38:38   作者:Dark And Grey  
汉诺塔是源于印度一个古老传说的益智玩具。大梵天创造世界时做了三根石柱,在一根柱子上从下往上按大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,三根柱子之间一次只能移动一个圆盘

汉诺塔简介:

在这里插入图片描述

我们想要实现的是 让 A柱上的盘子,移动到C柱上

1层汉诺塔

在这里插入图片描述

2层汉诺塔

在这里插入图片描述

3层汉诺塔详解图

在这里插入图片描述

第一步

在这里插入图片描述

第二步

在这里插入图片描述

第三步

在这里插入图片描述

第四步

在这里插入图片描述

第五步

在这里插入图片描述

第六步

在这里插入图片描述

第七步

在这里插入图片描述

经过上面的图解,相比大家一定在一定程度了解到汉诺塔的游戏规则,以及怎么去玩。

总之 最终C柱上第一个盘子,是最大,最顶的是最小的,而且在操作过程中,前几步就是为了让三个柱子中最大的盘子移动到C柱上,
然后不断,将它两个柱子中最大盘子往上累加,(盘子从大到小,从下往上摆放)

而且盘子一多,你就会发现过程中间,除了最大的盘子,其余的盘子都会集中在 B柱上,这样才能把 A 柱上最底下也是最大的盘子,移动到C上。
这是规律一

还有一个规律,在最大的盘子移动C柱上之后,第二个大的盘子要放在A柱上,其余盘子按照规则全部放在B柱上,
这样第二大的盘子才能移动到最大的盘子上

说白了,盘子再多,也要按照上面两个规律,才能完成整个游戏

那我把最大盘子上面的所有盘子看成一个整体,放在B柱上,最大盘子移动到C柱上,把B柱上盘子直接盖上去,不就行了,反正也就是重复那两个规律而已

在这里插入图片描述

程序如下

import java.util.Scanner;

public class Manuscript {
    static int times;// 移动次数
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        char A = 'A';
        char B = 'B';
        char C = 'C';
        int n = scanner.nextInt();
        game(n,A,B,C);
        scanner.close();
    }
    public static void move(int disk,char M,char N){
        System.out.println("第"+(++times)+"次移动,盘子"+disk+" "+M +"---->"+N);

    }
    public static void game(int n,char A,char B,char C){
        if(n==1){
            move(n,A,C);// 把A柱目前最大盘子放在C柱上,第一次肯定最大的那个
        }else{
            // 将 n-1 个 盘子 放到B柱子,注意ABC位置,再看看下面  move(n,A,C);,细细琢磨
            game(n-1,A,C,B);// A   B(C)  C(B)
            
            
            move(n,A,C);
            
            // 把n-1 个盘子 放在C上,注意ACB位置
            game(n-1,B,A,C);// A(B)  B(A) C
        }
    }
}

3层汉诺塔的输出结果附图(可以返回去看看,对一对)

在这里插入图片描述

有什么疑问,可以在下方讨论,切记 不要自己带入一个特别大数字去展开,带入一个 1 ~3 ,了解规律就行。不主张展开,主张掌握规律(递推公式)。

本文结束。

以上就是Java 实现一个汉诺塔实战练习的详细内容,更多关于Java 汉诺塔的资料请关注脚本之家其它相关文章!

相关文章

  • MyBatis查询缓存实例详解

    MyBatis查询缓存实例详解

    查询缓存的使用,主要是为了提高查询访问速度。这篇文章主要介绍了MyBatis查询缓存,需要的朋友可以参考下
    2017-06-06
  • spring boot配置druid连接池的完整步骤

    spring boot配置druid连接池的完整步骤

    这篇文章主要给大家介绍了关于spring boot配置druid连接池的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-01-01
  • 解决Maven项目本地公共common包缓存问题

    解决Maven项目本地公共common包缓存问题

    这篇文章主要介绍了解决Maven项目本地公共common包缓存问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • java如何将list中的某个元素移动位置

    java如何将list中的某个元素移动位置

    在Java编程中我们经常会使用List数据结构来存储一组元素,下面这篇文章主要给大家介绍了关于java如何将list中的某个元素移动位置的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-05-05
  • interrupt()和线程终止方式_动力节点Java学院整理

    interrupt()和线程终止方式_动力节点Java学院整理

    线程的thread.interrupt()方法是中断线程,将会设置该线程的中断状态位,即设置为true,中断的结果线程是死亡、还是等待新的任务或是继续运行至下一步,就取决于这个程序本身
    2017-05-05
  • Java中的StackOverflowError错误问题及解决方法

    Java中的StackOverflowError错误问题及解决方法

    这篇文章主要介绍了Java中的StackOverflowError错误,在本文中,我们仔细研究了StackOverflower错误,包括Java代码如何导致它,以及我们如何诊断和修复它,需要的朋友可以参考下
    2022-07-07
  • Java加载本地库的方法之System.load与System.loadLibrary

    Java加载本地库的方法之System.load与System.loadLibrary

    最近在做的工作要用到本地方法,所以下面这篇文章主要介绍了Java加载本地库的方法之System.load与System.loadLibrary的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-09-09
  • Spring的Eureka续约(心跳检测)详解

    Spring的Eureka续约(心跳检测)详解

    这篇文章主要介绍了Spring的Eureka续约(心跳检测)详解,eureka client每隔一定的时间,会给eureka server发送心跳,保持心跳,让eureka server知道自己还活着,需要的朋友可以参考下
    2023-11-11
  • 如何在springboot中配置和使用mybatis-plus

    如何在springboot中配置和使用mybatis-plus

    这篇文章主要给大家介绍了关于如何在springboot中配置和使用mybatis-plus的相关资料,MyBatis Plus是MyBatis的增强版,旨在提供更多便捷的特性,减少开发工作,同时保留了MyBatis的灵活性和强大性能,需要的朋友可以参考下
    2023-11-11
  • Java中WeakHashMap的弱键回收机制

    Java中WeakHashMap的弱键回收机制

    这篇文章主要介绍了Java中WeakHashMap的弱键回收机制,WeakHashMap继承AbstractMap,实现了Map接口,和HashMap一样,WeakHashMap也是一个散列表,它存储的内容也是键值对(key-value)映射,而且键和值都可以是null,需要的朋友可以参考下
    2023-09-09

最新评论