hanoi 问题
有三根针A、B、C。A针上有N个盘子,大的在下,小的在上,要求把这N个盘子从A针移到C针,在移动过程中可以借助B针,每次只允许移动一个盘,且在移动过程中在三根针上都保持大盘在下,小盘在上。
- 将n 个盘子从A针移到C针可以分解为三个步骤:
- 将A 上n-1个盘子移到 B针上(借助C针);
- 把A针上剩下的一个盘子移到C针上;
- 将n-1个盘子从B针移到C针上(借助A针)
递归算法:
public static void hanoi(int n, char A, char B, char C) {
if (n == 1) {
move(A, 1, C);
} else {
hanoi(n - 1, A, C, B);
move(A, n, C);
hanoi(n - 1, B, A, C);
}
}
Java实现代码
package 练习;
import java.util.Scanner;
public class hanoi {
public static void main(String[] args) {
System.out.println("请输入A塔上盘子的个数");
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
hanoi(n, 'A', 'B', 'C');
scanner.close();
}
public static void move(char x, int n, char y) {
System.out.println("把编号为[" + n + "]盘从" + x + " 移动到 " + y);
}
public static void hanoi(int n, char A, char B, char C) {
if (n == 1) {
move(A, 1, C);
} else {
hanoi(n - 1, A, C, B);
move(A, n, C);
hanoi(n - 1, B, A, C);
}
}
}
例如: 输入A 塔上有 3个盘子时:
输出结果为: