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 汉诺塔的资料请关注脚本之家其它相关文章!

相关文章

  • 巧用Spring中的@Order进行排序

    巧用Spring中的@Order进行排序

    这篇文章主要介绍了巧用Spring中的@Order进行排序,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • 浅谈SpringMVC国际化支持

    浅谈SpringMVC国际化支持

    这篇文章主要介绍了浅谈SpringMVC国际化支持,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • java中Supplier知识点总结

    java中Supplier知识点总结

    在本篇文章里小编给大家整理的是一篇关于java中Supplier知识点总结内容,有兴趣的朋友们可以学习下。
    2021-04-04
  • Java基于反射机制实现全部注解获取的方法示例

    Java基于反射机制实现全部注解获取的方法示例

    这篇文章主要介绍了Java基于反射机制实现全部注解获取的方法,结合实例形式分析了java反射机制获取注解的具体实现方法与操作注意事项,需要的朋友可以参考下
    2019-09-09
  • 在SpringBoot中实现一个订单号生成系统的示例代码

    在SpringBoot中实现一个订单号生成系统的示例代码

    在Spring Boot中设计一个订单号生成系统,主要考虑到生成的订单号需要满足的几个要求:唯一性、可扩展性、以及可能的业务相关性,本文给大家介绍了几种常见的解决方案及相应的示例代码,需要的朋友可以参考下
    2024-02-02
  • Java8语法糖之Lambda表达式的深入讲解

    Java8语法糖之Lambda表达式的深入讲解

    这篇文章主要给大家介绍了关于Java8语法糖之Lambda表达式的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • Java Cookie与Session实现会话跟踪详解

    Java Cookie与Session实现会话跟踪详解

    session的工作原理和cookie非常类似,在cookie中存放一个sessionID,真实的数据存放在服务器端,客户端每次发送请求的时候带上sessionID,服务端根据sessionID进行数据的响应
    2022-11-11
  • 为什么Java是程序员受欢迎的语言这几个原因你该清楚

    为什么Java是程序员受欢迎的语言这几个原因你该清楚

    Java一直稳居程序员很受欢迎的编程语言的榜首,是企业中使用最广泛的编程语言。这篇文章主要介绍了为什么Java是程序员受欢迎的语言这几个原因你该清楚,需要的朋友可以参考下
    2020-07-07
  • Java生成exe可执行文件

    Java生成exe可执行文件

    本文主要介绍了Java如何生成exe可执行文件,想了解更多的小伙伴可以借鉴阅读这篇文章
    2023-03-03
  • java 注解的基础详细介绍

    java 注解的基础详细介绍

    这篇文章主要介绍了java 注解的基础详细介绍的相关资料,希望通过本文大家能掌握注解的使用方法,需要的朋友可以参考下
    2017-09-09

最新评论