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

作者:Dark And Grey 时间:2021-12-20 14:49:47 

汉诺塔简介:

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

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

1层汉诺塔

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

2层汉诺塔

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

3层汉诺塔详解图

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

第一步

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

第二步

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

第三步

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

第四步

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

第五步

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

第六步

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

第七步

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

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

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

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

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

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

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

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

程序如下


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层汉诺塔的输出结果附图(可以返回去看看,对一对)

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

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

本文结束。

来源:https://blog.csdn.net/DarkAndGrey/article/details/120924413

标签:Java,汉诺塔,实战
0
投稿

猜你喜欢

  • java实体类转成map的实现

    2022-03-25 08:56:04
  • Mybatis TypeHandler接口及继承关系示例解析

    2021-11-19 03:33:34
  • mybatis in foreach 双层嵌套问题

    2023-11-24 12:55:47
  • Android自定义荷载进度的两种方法

    2022-08-29 03:21:39
  • Android客户端与服务端数据加密传输方案详解

    2023-07-14 13:55:37
  • C#中流的使用和分类

    2022-10-04 22:17:41
  • 深入理解java动态代理的两种实现方式(JDK/Cglib)

    2023-11-26 13:29:52
  • 常用类之TCP连接类-socket编程

    2021-08-03 16:46:25
  • Java Lambda表达式常用的函数式接口

    2021-10-30 13:43:53
  • C#之IP地址和整数互转的小例子

    2023-11-21 05:49:19
  • 复杂JSON字符串转换为Java嵌套对象的实现

    2023-07-02 05:40:26
  • Android View与Compose互相调用实例探究

    2021-06-11 09:07:29
  • C# 利用代理爬虫网页的实现方法

    2023-02-26 18:51:43
  • 一看就懂的Android APP开发入门教程

    2023-07-18 04:10:41
  • Java List分页功能实现代码实例

    2022-06-02 13:56:14
  • 详解OpenCV For Java环境搭建与功能演示

    2023-05-27 09:13:50
  • 详解Mybatis框架SQL防注入指南

    2023-09-16 02:49:02
  • Java字符串操作和C#字符串操作的不同小结

    2022-02-15 07:21:14
  • Java EE项目中的异常处理总结(一篇不得不看的文章)

    2023-06-16 23:35:26
  • JAVA设置手动提交事务,回滚事务,提交事务的操作

    2022-07-20 08:07:40
  • asp之家 软件编程 m.aspxhome.com