文章目录
思路
假设为起始柱A、辅助柱B及目标柱C,盘子数量为n
那么j可以将盘子从A全部转移到C分为三步:
1.A上面的n-1个盘子从A全部移到B
2.A上剩下的最大盘子移到C(C是目标柱所以要把最底层的移动到C)
3.B上n-1个移到C
其中1和3步的实现也是个汉诺塔问题,层层递归,解决两个盘的汉诺塔问题就可以解决多个盘的汉诺塔问题。根据此思路写出第一版本代码。
代码及代码优化
版本一:
void HanoiTower(int n,char from,char buffer,char to){
if(n<1){
System.out.println("input error");
}
else if(n==1){
System.out.println(from+"->"+to);
}
else if(n==2){
System.out.println(from+"->"+buffer);
System.out.println(from+"->"+to);
System.out.println(buffer+"->"+to);
}
else{
HanoiTower(n-1,from,to,buffer);
System.out.println(from+"->"+to);
HanoiTower(n-1,buffer,from,to);
}
}
后来发现两个盘子的情况可以并入多个盘子的情况,所以去掉n=2分支,版本二如下:
void HanoiTower(int n,char from,char buffer,char to){
if(n<1){
System.out.println("input error");
}
else if(n==1){
System.out.println(from+"->"+to);
}
else{
HanoiTower(n-1,from,to,buffer);
System.out.println(from+"->"+to);
HanoiTower(n-1,buffer,from,to);
}
}
完整运行代码与运行结果
package chapter1;
public class Hanoitower {
public static void main(String[] args){
Hanoitower h=new Hanoitower();
for(int i=0;i<5;i++){
System.out.println("Hanoi Tower"+i);
h.HanoiTower(i,'a','b','c');
}
}
void HanoiTower(int n,char from,char buffer,char to){
if(n<1){
System.out.println("input error");
}
else if(n==1){
System.out.println(from+"->"+to);
}
else{
HanoiTower(n-1,from,to,buffer);
System.out.println(from+"->"+to);
HanoiTower(n-1,buffer,from,to);
}
}
}
运行结果如下(Hanoi Tower n 表示解决n个盘子的汉诺塔问题):
Hanoi Tower0
input error
Hanoi Tower1
a->c
Hanoi Tower2
a->b
a->c
b->c
Hanoi Tower3
a->c
a->b
c->b
a->c
b->a
b->c
a->c
Hanoi Tower4
a->b
a->c
b->c
a->b
c->a
c->b
a->b
a->c
b->c
b->a
c->a
b->c
a->b
a->c
b->c
最后
好久没写java了,而且本人编程基础薄弱,有错请指正。