汉诺塔问题

题目:如下图所示,从左到右有A、B、C三根柱子,其中A柱子上面有从小叠到大的n个圆盘,现要求将A柱子上的圆盘移到C柱子上去,期间只有一个原则:一次只能移到一个盘子且大盘子不能在小盘子上面,求移动的步骤和移动的次数

汉诺塔
思路解析:以n=3为例,将 A 中最上面的圆盘移到 C 中,再将 A 中的第二个圆盘移到 B,再将 C 中的圆盘移到 B 上,再将 A 中的最下面的圆盘移到 C中,再 将 B 中的最上面个圆盘移到 A,再 B 中的 最下面 个圆盘移到 C,再移动 A 中的个圆盘移到 C

代码实现

public static void hanoid(int n,char a,char b,char c	) {
	if(n<=0) {
		return;
	}
	
	//	将上面的 n-1(即除去最下面的全部) 个圆盘借助 C柱 移到 B柱
	hanoid(n-1,a,c,b);
	
	//	当A柱只剩一个时,此时将 A 底下的那块最大的圆盘移到 C
	move(a,c);
	
	//	再将 B 上的 n-1 个圆盘借助 A柱 移到 C柱 上
	hanoid(n-1,b,a,c);
	
}

public static void move(char a, char b) {
	// TODO Auto-generated method stub
	System.out.println(a + "->" + b);
}

结果展示

汉诺塔代码演示
可以把n改成4或5,然后跟代码结果进行推导就会发现,核心就在于得将 A 柱上 n-1 个盘子,借助 C 柱的盘子移到 B 柱上,再将 A 上最大的移到 C 柱上,再借助 A 柱将 B柱的盘子移到 C上。

谢谢观看,路过点个赞…

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值