为了弄这个递归,简直快被逼疯。。。
package com.cskaoyan.sax;
import java.util.Scanner;
/*汉诺塔:
* A柱子上从上倒下按从小到大的顺序放着n个圆盘,最终要将这些圆盘以同样的顺序移动到C柱子上
*如果只有1个圆盘,可直接从A移动到C上,只需移动1次
*否则,如果有那个圆盘
*先将A上的n-1个盘子借助C柱子移动到B,再将A上剩下的一个圆盘直接移动到C
* 最后将B上的n-1个圆盘借助A移动到C
*
*/
public class Hanoi {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("请输入需要移动的盘子的个数n:");
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
hanoi(n,'A','B','C');
}
//步骤计数器
public static int step = 1;
//最终的结果是将所有的圆盘都移动到C柱
//先把剩下的n-1个圆盘看成一个,需要将他们从A柱借用柱C移动到B柱上,然后再将第n个圆盘直接移动到C柱上
//接下来,是以n-1圆盘所在的B柱开始,执行同上一步相同的操作,即借助C,将n-2个圆盘移动到到A住上
//其实可看作 (A) (B)
// 圆盘数 开始柱 借用柱 终点柱
//方法:移动方法
public static void hanoi(int n,char a,char b,char c){
if(n == 1){
move(n,a,c);
}
else{
hanoi(n-1,a,c,b);//先将n-1个圆盘从A柱借用C柱移动到B
move(n,a,c);
//接下来,执行n-1个圆盘的汉诺塔
hanoi(n-1,b,a,c);//再将n-1个圆盘从B柱借用A柱移动到C柱
}
}
//方法:打印移动顺序
public static void move(int n,char a,char b){
System.out.println("第"+step+"步,盘子"+n+"从"+a+"塔移到"+b+"塔");
step++;
}
}