要求
1、从A通过B移到C上
2、移动过程中,小盘子必须在大盘子上;
分析
1、一个盘子:直接 A->C
2、两个盘子:A->B A->C B->C
3、三个盘子:A->C A->B C->B A->C B->A B->C A->C
始 A->C A->B C->B
A->C B->A B->C A->C
4、四个盘子:过程中也是先要做到如图(从A移动三个盘子到B), 然后A->C,至于如何将三个盘子从A 到B,这个过程与上边(三个盘子从A 借助B到C)类似,我们可以看做是三个盘子从A 借助从C移动到B。
然后考虑如何将B上的三个盘子移动到C,类似的可以想到 三个盘子从B 借助A 移动到C。
- 更多盘子也是类似的移动方法,只要A上多于一个盘子,我们就先将N-1个盘子从A借助C移动到B上,再A->C,继续将N-1个盘子从B借助A移动到C上。
我们可以发现,过程中有一个类似的过程,n个盘子从 pos1 借助 pos2 移动到 pos3 ,我们可以将这个过程单独写成一个方法,这个方法使用递归写,终止条件是只有一个盘子要移动的时候。
代码
public class TestDemo {
public static void main(String[] args) {
hanota(1,'A','B','C');//测试一个盘子
System.out.println();
hanota(2,'A','B','C');//两个
System.out.println();
hanota(3,'A','B','C');//三个
}
public static void move(char pos1,char pos2){//输出
System.out.print(pos1+"->"+pos2+" ");
}
public static void hanota(int n,char pos1,char pos2,char pos3){
//n:移动的盘子的个数
// n个盘子 从 pos1(起始位置) 借助 pos2(中途位置) 移动到 pos3(目的位置)
if(n==1){
move(pos1,pos3);
}
else{
hanota(n-1,pos1,pos3,pos2);
move(pos1,pos3);
hanota(n-1,pos2,pos1,pos3);
}
}
}
//运行结果
A->C
A->B A->C B->C
A->C A->B C->B A->C B->A B->C A->C