题目: 有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方,请问至少需要多少次移动?
解答过程:
import java.util.Scanner;
public class 汉诺塔 {
static long count;
static void hanoi(int n, char a, char b, char c) {
if (n == 1) {
count++;
System.out.println("第" + count + "次移动:\t圆盘从" + a + "棒移动到" + c + "棒");
} else {
hanoi(n - 1, a, c, b);
count++;
System.out.println("第" + count + "次移动:\t圆盘从" + a + "棒移动到" + c + "棒");
hanoi(n - 1, b, a, c);
}
}
public static void main(String[] args) {
int n;
count = 0;
Scanner input = new Scanner(System.in);
n = input.nextInt();
hanoi(n, 'A', 'B', 'C');
System.out.println("共需要" + count + "步移动");
}
}
解题思路:
若只有一个圆盘,则直接从a->c,若大于1,则圆盘从a->b,再从b->c
递归的思想在于,把大于1以外的所有圆盘想象成一个小圆盘,小圆盘需要先从a->b,等大圆盘从a->c之后,再从b->c