汉诺塔详情请参考:https://blog.csdn.net/xb2355404/article/details/79144451
汉诺塔规则:
有n个盘子,从第一个柱子,移动到第三个柱子。要求每个盘子从柱子上到柱子下,序号是从小到大。
假设三个柱子:A,B,C
我们要求将所有盘子 从A移动C
分析:
当盘子是一个的时候,直接将盘子从A移动到C
当是两个盘子的时候,我们将上方盘子标记为序号1,下面个盘子为序号2.
(1)我们将1移动到B,(上方的盘子从A移动到中间位置)
(2)2移动到C, (将最后一个盘子从A移动到C)
(3)最后将1从中间位置B移动到C。(将上方的盘子,从中间移动到第三位置)
当时三个盘子的时候,我们一次从上到下给盘子标号1,2,3.
(1)我们将1移动到C,将2移动到B,再将1从C移动到B,(到这里我们将上方两个盘子作为一个整体,并且将它整体移动到了中间位置)
(2)将3从A移动到C,
(3)将1从B移动到A,将2从B移动到C,将1从A移动到C(这一步是将上方两个盘子整体从中间位置移动到第三位置)
推论:无论多少个我们都将其视为两个盘子,将上方的n-1个盘子视为整体,最后一个盘子视为一个整体。
我们只需要完成三步骤:
1.将上方n-1个盘子从第一位置移动到中间位置
2.将最后一个盘子n从第一位置移动到最后
3.将上方的n-1个盘子从中间位置移动到第三位置
代码实现:
public class Hanoi{
public static void main(String[] args){
hanoi(3,'A','B','C');
}
/**
*
* @param n 柱子数量
* @param init 第一个柱子
* @param middle 中间柱子
* @param desti 目标柱子
*/
public static void hanoi(int n,char init,char middle,char desti){
if(n==1){
System.out.println("第1个盘子从"+init+"--->"+desti);
}//
else{
//移动上面的所有盘子借助(第三个柱子)从第一个柱子移动到中间柱子
hanoi(n-1,init,desti,middle);
//移动第n个,从第一个位置移动到第三个柱子
System.out.println("第"+n+"个盘子从"+init+"--->"+desti);
//将上面所有盘子从中间柱子移动到第三个位置
hanoi(n-1,middle,init,desti);
}
}
}