问题描述:
有A,B,C三个柱子,需要通过柱子B,将柱子A上的盘子挪到柱子C上,且挪动过程中,大盘子始终在下,小盘子始终在上。问,如果有n个盘子,需要挪动多少次。
例子:A上有三个盘子
当有3个盘子需要我们挪动七次。
个人理解:
使用递归,如果需要挪动n个盘子(n>1)时,那么对于最后一个大盘子n来说只需要3个步骤。
1:将n-1个盘子挪到B柱子
2:将最大的盘子n挪到C柱子
3:将n-1个盘子挪到C柱子
1:将n-1个盘子挪到B柱子
2:将最大的盘子n挪到C柱子
3:将n-1个盘子挪到C柱子
那么以此类推,直到盘子数是1时,只需要挪动1次。
代码:
//汉诺塔 n盘子数 pillars1起始柱子 pillars2中转柱子 pillars3目的柱子
public static int hanoi(int n,char pillars1,char pillars2,char pillars3){
if(n==1){
//最后一个盘子从A柱子挪到C柱子
move(pillars1, pillars3);
return 1;
}else {
//将n-1个盘子从A柱子通过C柱子挪到B柱子
int h1=hanoi(n-1,pillars1,pillars3,pillars2);
move(pillars1, pillars3);
// 1是将一个盘子从A挪到C
int h2=hanoi(n-1,pillars2,pillars1,pillars3 );
// 第二个hanoi(n-1)是将n-1个盘子从B柱子通过A柱子挪到C柱子
return h1+1+h2;
}
}
//打印挪动步骤
public static void move(char a,char b){
System.out.println(a+"->"+b);
}
public static void main(String[] args) {
System.out.println(hanoi(3,'a','b','c'));
}
测试结果:
三个盘子,a,b,c三个柱子。