汉诺塔问题就是此时有三根柱子,而我们需要将其中一个柱子上的n个从大到小的盘子借助一根辅助的柱子放到另外一根柱子上,但前提是每根柱子上的盘子都必须按照从大到小的顺序排列,如图
需要特别注意的是每一次的移动都必须是大盘子在下小盘子在上, 我们假设只有两个盘子时,我们就需要先将最上面的盘子放在辅助的柱子B上,然后将最下面的盘子放在C柱上,再将B柱上的盘子放在C柱上.
下面我们以三个盘子为例,要将A柱上的盘子全部放到C柱上, 那么:
1、把最上面两个盘子放到B柱上
2、把最下面的盘子放到C柱上,完成这两步后如图
3、将B柱上的盘子移动到C柱上就完成整个过程
最后我们假设有n个盘子,那么通过前面的分析就可以得知,我们只需要将n-1个盘子放在辅助柱B上, 第n个盘子就可以放在C柱上, 这个时候A柱就空了,我们把A柱当成辅助柱, 将B柱上除最大盘子以外的其他盘子放在辅助柱A上,然后将B柱上的最大盘子放在C柱上, 依次类推就可以实现整个过程.
代码如下:
static int step = 0; //记录一共移动了多少步
//每运行一次打印下结果
public static void move(String A,String C){
System.out.println(A +"------>" + C);
step++;
}
//将A柱上的盘子移动到C柱
public static void Hanoi(int n, String A, String B, String C) {
if (n == 1) {
move(A, C);
} else {
Hanoi(n - 1, A, C, B); //A为初始柱,C为目标柱,B为辅助柱
move(A, C);
Hanoi(n - 1, B, A, C); //B为初始柱,A为辅助柱,C为目标柱
}
}
public static void main(String[] args) {
Hanoi(3, "A", "B", "C");
System.out.println(step);
}
}
温馨提示:运行代码时盘子数不应当太多, 盘子数太多导致步骤太多,计算机会陷入类似死循环算不出结果.( 移动步数 == (2^n) - 1 ).