我们设A为起始柱子,B为辅助柱子,C为目标柱子
由于盘子只能是大的放在下面,小的放在上面,因此,我们需要先将A柱子除了最下层的盘子都移动至B柱子
如下所示完成了最下层柱子到达它的最终位置,接下来,我们需要将B柱子上除了最下层的盘子之外的盘子移动至A,重复上述步骤
每次变化的点有两个:
1:柱子的功能
默认条件下,我们设置A为初始柱子,B为辅助柱子,C为目标柱子
设圆盘的个数为n
那么第一次我们需要将A柱子上的n-1个盘子借助C按照大小移动至B,由此B成为目标柱子,C为辅助柱子,当最下层的柱子到达C后,第一次完成(A为空柱子,B有n-1个盘子,C有1个盘子)
那么第二次我们需要将B柱子上的n-1-1个盘子借助A按照大小移动至C,由此C成为目标柱子,A为辅助柱子,当最下层的柱子到达C后,第二次完成(A有n-1-1个盘子,B为空柱子,C有2个盘子)
…
我们可以将除了最下层之外的n-1个圆盘看作一个整体,其实也就是2个盘子移动的问题,内部就是一个不断递归的过程
2:圆盘的数量
需要移动的圆盘的数量每次完成之后-1,而到达最终位置的圆盘数量每次完成之后+1
实现:
import java.util.Scanner; public class test10 { public static void main(String[] args) { Scanner in = new Scanner(System.in); System.out.println("请输入圆盘的数量"); int num = in.nextInt(); hanoi(num, 'A', 'B', 'C');//起始柱、辅助柱、目标柱默认为A、B、C } public static void hanoi(int num, char a, char b, char c){ if (num == 1) { System.out.println("第" + num + "个圆盘从" + a + " -> " + c); }else{ //每当有一个盘子到达最终位置,目标柱和起始柱就要发生变化 hanoi(num - 1, a, c, b); System.out.println("第" + num + "个圆盘从" + a + " -> " + c); hanoi(num - 1, b, a, c); } } }
请输入圆盘的数量 3 第1个圆盘从A -> C 第2个圆盘从A -> B 第1个圆盘从C -> B 第3个圆盘从A -> C 第1个圆盘从B -> A 第2个圆盘从B -> C 第1个圆盘从A -> C