汉诺(Hanoi)塔问题:
古代有一个梵塔,塔内有三个座A、B、C,A座上有64个盘子,盘子大小不等,大的在下,小的在上(如图)。有一个和尚想把这64个盘子从A座移到B座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上。在移动过程中可以利用B座,要求打印移动的步骤。如果只有一个盘子,则不需要利用B座,直接将盘子从A移动到C。
这个问题需要用到递归的思想,直接上代码,代码里每句我都加入了详细解释,有问题可以留言。
HanoiTower类:
public class HanoiTower {
//N个盘子从A经过B移动到C
//标记盘子从小到大 1——>n号
public static void moveTower(int n,char A,char B,char C) {
//如果只有1个盘子,直接从A移动到C
if(n == 1) {
System.out.println("盘1从"+ A + "移动到" + C);
}
else {
//否则上面n-1个盘子通过C移动到B柱子上
moveTower(n - 1, A, C, B);
//然后把第n个盘子直接从A移到C柱上
System.out.println("盘" + n + "从" + A + "移动到" + C);
//再把其余移到B上的盘子通过A移动到C上,就完成了
moveTower(n - 1, B, A, C);
//通过递归,传入的n会逐渐减少,ABC对应的位置也会不断变化,最终化解为移动一个盘子
}
}
}
Test类:
public class test {
public static void main(String[] args) {
HanoiTower.moveTower(5,'A','B','C');
}
}
运行的结果:
盘1从A移动到C
盘2从A移动到B
盘1从C移动到B
盘3从A移动到C
盘1从B移动到A
盘2从B移动到C
盘1从A移动到C
盘4从A移动到B
盘1从C移动到B
盘2从C移动到A
盘1从B移动到A
盘3从C移动到B
盘1从A移动到C
盘2从A移动到B
盘1从C移动到B
盘5从A移动到C
盘1从B移动到A
盘2从B移动到C
盘1从A移动到C
盘3从B移动到A
盘1从C移动到B
盘2从C移动到A
盘1从B移动到A
盘4从B移动到C
盘1从A移动到C
盘2从A移动到B
盘1从C移动到B
盘3从A移动到C
盘1从B移动到A
盘2从B移动到C
盘1从A移动到C