汉诺塔问题(java实现)

版权声明:原创文章未经博主允许不得转载O(-_-)O!!! https://blog.csdn.net/u013894072/article/details/52958355

一直用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/

一家之言,自己备忘

猜你喜欢

转载自blog.csdn.net/u013894072/article/details/52958355