import java.util.Scanner;
public class Hanio {
static int count=0;//记录移动次数
public static void move(int num,char start,char end){
//将盘子从小到大编号,每次将编号为num的盘子,从start柱子移动到end柱子
System.out.println("第"+(++count)+"次移动,将"+num+"号盘子从"+start+"柱子移动到"+end+"号柱子上");
}
public static void hanio(int total,char A,char B,char C) {
//total为盘子总数
//默认A柱子为起始柱子
//默认B柱子为辅助柱子
//默认C柱子为终点柱子
/*
思路:
将上面total-1个盘子从A移动到B(无需思考移动细节),再将最后一个盘子(最底下最大的)先移动到终点柱C
最后只需将B柱子的total-1个盘子借助A柱子移动到C即可
*/
if (total==1) {
Hanio.move(1, A, C);
//盘子总数为1时,total-1个盘子已经在C终点柱子,只需将1号(汉诺塔最上面的盘子)直接从起始A柱移动到C即可
} else {
hanio(total-1, A, C, B);
//total-1个盘子从A移动到B,借助C
Hanio.move(total, A, C);
//将最后一个盘子(最下面最大的盘子)从A移动到C
hanio(total-1, B, A, C);
//将total-1个盘子从B移动到C,借助A
}
}
public static void main(String[] args) {
//主函数
Scanner sc=new Scanner(System.in);
//定义三根柱子
char a='A';
char b='B';
char c='C';
System.out.println("请输入汉诺塔盘子总数:");
//初始化盘子总数
int total=sc.nextInt();
hanio(total, a, b, c);
//汉诺塔执行函数(移动细节在函数内部)
System.out.println("结束");
}
}
执行结果图:
n个盘子总的移动次数为:2^n-1次