我们设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