什么是汉诺塔
-
汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。有三个金刚石塔,第一个从小到大摞着64片黄金圆盘。现在把圆盘按大小顺序重新摆放在最后一个塔上。并且规定,在小圆盘上不能放大圆盘,在三个塔之间一次只能移动一个圆盘。
-
也就是说需要将A上的圆盘全部移动到C上,并且要保证小圆盘始终在大圆盘上。
实现方式
首先,我们可以先列出前几种结果
1.当圆盘个数为1时
- 第1个圆盘直接从A—>C
2.当圆盘的个数为2时
- 第1个圆盘从 A—>B
- 第2个圆盘从 A—>C
- 第1个圆盘从 B—>C
3.当圆盘的个数为3时
-
第1个圆盘从 A—>C
-
第2个圆盘从 A—>B
-
第1个圆盘从 C—>B
-
第3个圆盘从 A—>C
-
第1个圆盘从 B—>A
-
第2个圆盘从 B—>C
-
第1个圆盘从 A—>C
然后我们不难发现,由从A—>C这一步骤我们就可以将整个过程划分为三个部分
1.中间的上一步 ----- 把n-1个盘子由A 移到 B
2.中间一步 ----- 把第n个盘子由 A移到 C
3.中间的下一步 ----- 把n-1个盘子由B 移到 C
代码实现:
public class HanoiTest {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入圆盘的个数:");
int num = scanner.nextInt();
char start = 'A';
char middle = 'B';
char end = 'C';
HanoiTest.hanoi(num,start,middle,end);
}
//count的作用是记录移动的次数
public static int count;
public static void move(int disk, char start, char end){
System.out.println("第" + (++count) + "次移动,将" + disk +"号圆盘从" + start + "移动到" + end);
}
public static void hanoi(int n, char A, char B, char C){
if (n == 1){//圆盘只有一个的话,直接从A移到C
move(1, A, C);//也就是将第一个盘子移动到C上
}else{
//整个过程可分为三部分
//1.先将n-1个盘子通过C移动到B上
hanoi(n - 1, A, C, B);
//2.将第n个盘子直接从A移动到C上
move(n, A, C);//中间阶段,
//3.将移动到B上的盘子通过A移动到C上
hanoi(n - 1, B, A, C);
}
}
}