汉诺塔问题的解决思路及算法

关于汉诺塔问题,好多时候当时理解了过段时间可能又会忘,其实这个代码很简单,主要还是分治思想理解不够透彻。

架设3根柱子分别为A、B、C,圆盘数目为n。

1:如果A有一个圆盘,则直接移动至c。

2:如果A有2个圆盘,则A->B,A->C,B->C。

好了这个时候已经可以解决问题了,结束条件为 n==1;

假设当我们在数目为n-1的时候已经解决了移动问题可以成功移动至C,如果又多了一个呢,即n,我们用同样的方法把圆盘移动至B(我们已经可以把n-1个盘子通过B移动至C了,那么通过C移动至B也一样),为什么移动至B了呢,因为多了个盘子(放在最底部的大盘子),我们要向步骤2一样把上面的n-1个盘子看成一个整体,用上一个方法即移动n-1个盘子的方法把上面的n-1个盘子移动至B,然后把新增的那个大盘子移动至C,然后再用移动n-1个盘子对应的方法把B中的n-1个盘子移动至C,就完成了。

下面贴代码:

void hanoi( char A, char B, char C, int n)	//这样设置参数是为了说明要通过B这个辅助柱子把A中的盘子移动至C.很关键,ABC换下位置含义就变了
{
	if(1 == n)
	{
		cout << A << "->" << C << endl;	//如果只有一个盘子不需要任何方法,直接移动
	}
	else
	{
		hanoi(A, C, B, n - 1);	//如果不止一个盘子则调用移动n-1个盘子的方法,把上面的n-1个盘子由A,借助C移动至B,A就只剩一个最大的了.
		cout << A << "->" << C << endl;	//把A里剩下的最大那个盘子直接移动至C
		hanoi(B, A, C, n - 1);	//这时候C里有个最大的,B有n-1个排好的盘子,同样用移动n-1个盘子的方法来把这n-1个盘子移动至C,结束
	}
}

  • 8
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值