汉诺塔问题源自印度一个古老的传说,印度教的“创造之神”梵天创造世界时做了 3 根金刚石柱,其中的一根柱子上按照从小到大的顺序摞着 64 个黄金圆盘。梵天命令一个叫婆罗门的门徒将所有的圆盘移动到另一个柱子上,移动过程中必须遵守以下规则:
1.每次只能移动柱子最顶端的一个圆盘;
2.每个柱子上,小圆盘永远要位于大圆盘之上;
下面我将附上我的代码和解题思路:
代码如下:
/**
* 汉诺塔问题
*/
public class HanNuota {
public static void main(String[] args) {
hanoi(3,'A','B','C');
System.out.println("总的移动了:"+ (n-1) +"次");
}
//定义n来记录移动次数
public static int n = 1;
/**
* 定义一个递归函数来实现汉诺塔的移动问题
* @param num 汉诺塔层数
* @param begin 开始柱
* @param end 目标柱
* @param middle 中转站
*/
public static void hanoi(int num,char begin,char end,char middle){
if(num == 1){
//如果层数为1,直接将其移动到目标柱
System.out.println("第"+ n +"次:从"+ begin +"移动到"+ end);
n++;
}else {
//目前情况:begin上有num层,middle无,end无
//把begin上面的num-1层移动到middle(这里把end和middle换位置,这样就把num-1层移到了middle上)
hanoi(num-1,begin,middle,end);
//目前情况:begin上有1层,middle上num-1有层,end无
//把begin的那层移动到end
System.out.println("第"+ n +"次:从"+ begin +"移动到"+ end);
//目前情况:begin无,middle上有num-1层,end上有1层
n++;
//把middle的num-1层移动到end(这里把begin和middle换位置,这样就把num-1层移动到了end上)
hanoi(num-1,middle,end,begin);
}
}
}
运行结果图如下:
结题思路及过程:
为了帮助大家更好的理解我的解题思路,在这里的解题过程精确到了每一步。
我在这里列举了层数为3时的运行过程,其它层数的仿照这个进行就能得到过程及结果。
//step1: 此时参数顺序为begin A,end B,middle C
hanoi(3,begin A,end B,middle C){
//step2(在step1的基础上): 把end和middle换位置,此时参数顺序为begin A,middle B,end C
hanoi(2,begin A,middle B,end C){
//在step2的基础上 把end和middle换位置,此时参数顺序为begin A,end B,middle C
hanoi(1,begin A,end B,middle C){
System.out.println("第"+ n +"次:从"+ begin +"移动到"+ end);//A->B
n++;
}
System.out.println("第"+ n +"次:从"+ begin +"移动到"+ end);//A->C
n++;
//在step2的基础上 把begin和middle换位置,此时参数顺序为middle A,begin B,end C
hanoi(1,middle A,begin B,end C){
System.out.println("第"+ n +"次:从"+ begin +"移动到"+ end);//B->C
n++;
}
}
System.out.println("第"+ n +"次:从"+ begin +"移动到"+ end);//A->B
n++;
//step3(在step1的基础上): 把begin和middle换位置,此时参数顺序为middle A,end B,begin C
hanoi(2,middle A,end B,begin C){
//在step3的基础上 把end和middle换位置,此时参数顺序为end A,middle B,begin C
hanoi(1,end A,middle B,begin C){
System.out.println("第"+ n +"次:从"+ begin +"移动到"+ end);//C->A
n++;
}
System.out.println("第"+ n +"次:从"+ begin +"移动到"+ end);//C->B
n++;
//在step3的基础上 把begin和middle换位置,此时参数顺序为begin A,end B,middle C
hanoi(1,begin A,end B,middle C){
System.out.println("第"+ n +"次:从"+ begin +"移动到"+ end);//A->B
n++;
}
}
}