汉诺塔问题(java实现)

时间:2021-10-17 11:19:49

一直用Python,数据结构、算法设计什么的上大学也没学过(不是计算机专业)。那天有个习题是汉诺塔题,憋了半个小时没憋出来,就看了看网上的解释,才写出来的。。。java版

问题:

据说古代印度还是埃及有个塔叫做波罗教塔(汉诺塔),上面有三根钻石石柱(真TM有钱)。神说在第一根上面有小到大放上64个金色盘子,命令那些奴才们从第一根移动到第三根上面,搬运中必须遵守大盘在小盘下面的规矩。每天只能搬动一个,等全把盘子搬到第三个上面的时候,这个塔就崩了。。世界就灭亡了。。。让你求一求这个世界末日
这个是用递归,看网上的解释也很迷茫,自己思考了一下,大概是这么回事。第一根柱子A,第二根柱子B,第三根柱子C。A上面有N个盘子,这里先要借助B为过渡,把N-1个盘子移动到B上,再把第N个盘子移到C上去。然后以A为过渡,把N-2个盘子移到A上去,第N-1个移动到C上去,依次往下。。。。等N=1的时候,直接把盘子丢给C就好了。
代码如下:

    //移动的函数
public static void move(int num,String from,String to){
System.out.println("move "+String.valueOf(num)+" from "+from+" to "+to);
}
public static int jiaohuan(int num,String a,String b,String c){
int count=0;//计算步数的
if (num==1){
move(num,a,c);
count++;
}
else{
int x=jiaohuan(num-1,a,c,b);//把N-1个盘子放到B上面
move(num,a,c);//把第N个盘子给C
int y =jiaohuan(num-1,b,a,c);//以A为中间过渡,把B上的盘子给C
count += x+y+1;
}
return count;
}
public static void main(String args[]){
String A="One",B="Two",C="Three";
int num=3;
int p=jiaohuan(num,A,B,C);
System.out.println("cishu is :"+String.valueOf(p));
//打印出次数来看看用了多少步
}

num=3的时候,移动次数是7
num=4的时候,移动次数是15
num=5的时候,移动次数是31

num=20的时候,移动次数是1048575
也就是说,每天移动一个,就算只有20个柱子,也要移动2800多年。。。

我从这个地方看到的解释C代码
http://blog.csdn.net/kkkkkxiaofei/article/details/8333644/

一家之言,自己备忘