汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?
思路:
对于三个的时候,假若都在A这个位置,要移到C位置。那么首先使得前两个金盘通过C位置移到B位置,然后第三个(也就是最大的那个)直接移动到C位置。接着B位置最上面的那个(也就是最小的那个)移动到A位置,再将B中的金盘(第二大的)移动到C位置,最后把A位置的移动到C位置。
当数量增加的时候,可以采用这样的方法,思路不变仅仅是过程多了。因此采用递归的方式可以解决。
import java.util.Scanner;
public class Hanoi {
static Long step = 1L;
public static void main(String[] args) {
System.out.print("请输入金盘个数:");
Scanner cin = new Scanner(System.in);
int n = cin.nextInt();
HanoiSol(n, 'A', 'B', 'C');
}
private static void HanoiSol(int n, char A, char B, char C) {
if(n == 1) {
move(n, A, C);
}
else {
HanoiSol(n-1, A, C, B);//把n-1个从A通过C移到B
move(n, A, C);
HanoiSol(n-1, B, A, C);
}
}
private static void move(int n, char A, char B) {
System.out.println("第" + step++ + "步:把第" + n + "个金盘从" + A + "位置移到" + B + "位置");
}
}
运行结果:
如果错误或不合理的地方,敬请指正哦~
加油!!