【Java SE】汉诺塔问题

简介: 【Java SE】汉诺塔问题

🐳一、汉诺塔简介:

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

🐳二:汉诺塔问题思路:

在移动的过程中要保证大盘在小盘的下面,目标是把第一个柱子上的圆盘都按规律移动到第三个柱子上。

当A柱上只有一个圆盘的时候,直接从A移动到C柱

 

当A柱上有2个圆盘的时候,先把最上面的圆盘移动到B柱,再把A柱剩余的一个盘子移动到C柱,最后把B柱上的圆盘放到C盘即可完成。

 

当A柱有3个圆盘的时候,先将最上面的一个盘子放到C柱,再把第二个盘子放到B柱,在把C柱的盘子放到B柱,然后把A柱的盘子放到C柱,再把B柱的上面的一个盘子放到A柱,然后把B柱的盘子放到C柱,最后把A柱的盘子放到C盘即可。如动图所示:

现在假设有n个盘子,(n>=2),我们把最上面的n-1个盘子看成一个整体,最下面的盘子就是第n个盘子为一个整体。

步骤:1、先把n-1个盘子移到B上,C作为辅助,(此时,A是出发点,B是目标点,C是辅助点)

          2、把最大的盘子,也就是第n个盘子,直接放到C上

          3、再把B上的n-1个盘子放到C上,A作为辅助(此时,B是出发点,C是目标点,A是辅助点)

🐳代码实现:

1. public class Test {
2. /**
3.      *
4.      * @param n     盘子的数量
5.      * @param pos1  出发位置
6.      * @param pos2  中转位置
7.      * @param pos3  目标位置
8.      */
9. public static void hanio(int n,char pos1, char pos2,char pos3) {
10. if(n == 1) {//如果就一个盘子,就直接把A柱的盘子放到C柱
11.             move(pos1,pos3);
12. return;
13.         }
14. //如果盘子大于1
15.         hanio(n-1,pos1,pos3,pos2);//先把n-1个盘子移到B上,C作为辅助,(此时,A是出发点,B是目标点,C是辅助点)
16.         move(pos1,pos3);//把最大的盘子,也就是第n个盘子,直接放到C上
17.         hanio(n-1,pos2,pos1,pos3);//再把B上的n-1个盘子放到C上,A作为辅助(此时,B是出发点,C是目标点,A是辅助点)
18.     }
19. 
20. /**
21.      *
22.      * @param pos1 起始位置
23.      * @param pos2 目标位置
24.      */
25. 
26. public static void move(char pos1,char pos2) {
27.         System.out.print ("盘子的移动路线为:"+pos1+" -> " + pos2+" ");
28.         System.out.println();
29.     }
30. 
31. 
32. public static void main(String[] args) {
33.         hanio(3,'A','B','C');
34. 
35.     }
36. }

🐳运行结果:

当为三个盘子的时候:

当为4个盘子的时候:


相关文章
|
7月前
|
存储 Java 编译器
【Java SE语法篇】7.面向对象——类和对象
【Java SE语法篇】7.面向对象——类和对象
【Java SE语法篇】7.面向对象——类和对象
|
7月前
|
存储 Java
【Java SE语法篇】3.运算符
【Java SE语法篇】3.运算符
|
7月前
|
存储 Oracle Java
【Java SE语法篇】2.数据类型和变量
【Java SE语法篇】2.数据类型和变量
|
7月前
|
Java
【汉诺塔】经典递归问题(Java实现)图文并茂讲解
【汉诺塔】经典递归问题(Java实现)图文并茂讲解
|
3月前
|
Oracle Java 关系型数据库
Java(TM) Platform SE binary 已停止工作”的解决方法
Java(TM) Platform SE binary 已停止工作”的解决方法
269 2
|
7月前
|
Java
<Java SE> 5道递归计算,创建数组,数组遍历,JVM内存分配...
<Java SE> 5道递归计算,创建数组,数组遍历,JVM内存分配
63 2
|
6月前
|
Java
汉诺塔(java)
汉诺塔(java)
|
7月前
|
Java
<Java SE> 数组详解大全(附带练习题).一维数组、二维数组、数组拷贝、数组遍历...
<Java SE> 数组详解大全(附带练习题).一维数组、二维数组、数组拷贝、数组遍历
58 0
|
7月前
|
Java 开发框架 XML
JDK、JRE、Java SE、Java EE和Java ME有什么区别?
JDK、JRE、Java SE、Java EE和Java ME有什么区别?
|
7月前
|
Java 索引
Java SE ____二维数组
Java SE ____二维数组
下一篇
DataWorks