题目描述
河内塔(又称汉诺塔)问题,就是在一块木板上有三个立柱,在柱A上放着三个圆盘,小的在上面,大的在下面(初始状态)。让被试将在柱1上的三个圆盘移到柱C上面(目标状态)。条件是:每次只能移动任何一个柱子上面的一个圆盘,但大的圆盘不能放在小的圆盘上。
解题思路
柱A是起点,柱C是终点,柱B作为辅助。
- 一个圆盘时,A到C
- 二个圆盘时,A到B,A到C,B到C
- 三个圆盘时,先将A的上两个圆盘移到B,再A最后圆盘到C,然后B两个圆盘到C
- 四个圆盘时,步骤同上先移三个圆盘到B,再A最后圆盘到C,最后B三个圆盘到C
- …一次类推,每次只能借助辅助柱处理最上两个,如是循环。
- 所以依靠递归来解决。
代码
public class Project004 {
public static void main(String[] args) {
char A = 'A',B = 'B',C = 'C';
int total = hanoi(4, A, B, C);
System.out.println("总步数:"+total);
}
/**
*
* @param n 盘子数
* @param A 起点
* @param B 辅助
* @param C 终点
*/
static int sum = 0;//总步数
public static int hanoi(int n,char A,char B,char C){
if(n == 1){
sum ++;
System.out.println("第"+sum+"步:"+A +" --> "+C);
}else{
/*A上n-1个*/
hanoi(n-1,A,C,B);
hanoi(n-1,B,A,C);
sum ++;
System.out.println("第"+sum+"步:"+A +" ---> "+C);
}
return sum;
}
}