目录
一、简介
汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
我们要实现的,就是把A柱子上的n个盘子移动到C柱子上
要求:一次只能挪动一个盘子;
小盘子必须在大盘子上(任何时候);
二、分析
第一种情况:当n=1时:
第二种情况:当n=2时:
第三种情况,当n=3时:
结合上述三种情况可以看出,当A柱子有n个盘子需要挪动时,每次要先考虑的都是把前n-1个盘子从A柱子挪到B柱子,然后再把第n个盘子挪到C柱子上,此时A柱子没有盘,就作为中间柱子,可以理解为AB柱子位置对调,那么问题又转化成了当前新A柱子的前n-1个盘子挪动到新B柱子,然后又把新A柱子的第n个盘挪到C柱子上的问题,以此类推。
思路为:
(1):当n=1时,将1号盘子从A柱子移动到C柱子
(2):当n>1时,第一步将前n-1个盘子从A移动到B,C为中间柱子。
第二步,将n号盘子从A移到C
第三步,将A作为中间柱子,最终要将n-1个盘子挪到c,此时问题直接回归第一步,构成了递归调用。
三、代码
完整代码:
public class Hanoi {
public static void main(String[] args) {
hanoi(3,"A","B","C");
}
public static void hanoi(int n,String a,String b,String c){
if (n == 1){
move(n,a,c);
return;
}
//将c看作中间柱子,将n-1个盘子从a移动到b
hanoi(n-1,a,c,b);
move(n,a,c); //将第n个盘子从a移到c
//将a看作中间柱子,将n-1个碟子从b移动到c
hanoi(n-1,b,a,c);
}
public static void move(int no, String from,String to){
System.out.println("将"+no + "号盘子从" + from+"柱子" + "移动到"+to+"柱子");
}
}
执行结果:
Over!!!