汉诺塔程序理解

      汉诺塔(Hanoi Tower)又称作河内塔,在印度神话传说中,大梵天创造世界是建造了三根金刚石柱,在其中一根柱子上有64个大小不一的黄金圆盘,大圆盘放在了小圆盘下面。大梵天让婆罗门将圆盘从一根柱子转移到另一根柱子,转移过程中每次只能转移一个圆盘,且大圆盘要始终在小圆盘的下面。

假设三根柱子的编号分别是A,B,C。A柱为起始柱,B柱为中间柱,C柱为目标柱。

当汉诺塔只有1层时,将圆盘从起始柱(A柱)直接转移到目标柱(C柱)即可完成任务。

       当汉诺塔有2层时,可以将小圆盘移到中间柱(B柱)上,剩下的大圆盘重复只有一层的动作(从起始柱(A柱)移到目标柱(C柱)),最后将小圆盘从中间柱(B柱)移到目标柱(C柱)。

       当汉诺塔的层数为3层时,移动起来就比较麻烦了。首先最小的圆盘应该先移到B柱还是C柱,移到不同 的柱上结果是不一样的。现在我们换一种思路,要求是小圆盘在大圆盘上面,大圆盘肯定要放在目标柱(C柱)的最底下。我们可以考虑一下先把起始柱(A柱)上的上面两个圆盘放到中间柱(B柱)上,然后把起始柱(A柱)的大圆盘移到目标柱(C柱)上。此时,中间柱(B柱)有两个圆盘,目标柱(C柱)有一个最大的圆盘,现在我们将中间柱(B柱)看做是起始柱,将起始柱(A柱)看做中间柱,问题就回到了两个圆盘的时候,就可以用两个圆盘的移法来解决这个问题。

      由上述问题可以推出,当汉诺塔的层数为n层时,我们可以将其一层一层的简化,现在忘掉A,B,C柱。首先将n-1层看做一个整体,将其从起始柱移到中间柱,将第n个圆盘移到目标柱,随后将中间柱看做起始柱,起始柱看做中间柱,将第n-1个圆盘放到目标柱。随后一直递减,直到剩一个圆盘,从起始柱移入目标柱。

      其中就用了递归思想。

代码如下:

#include<stdio.h>

void move(int n, char P1, char P3)
{
	printf("第%d个盘:%c-->%c\n",n,P1,P3);
}

void Hanoi(int n, char P1, char P2, char P3)      //P1为起始柱,P2为中间柱,P3为目标柱。
{
	if(n ==1)
	{
		move(n, P1, P3);
	}
	else
	{
		Hanoi(n-1, P1, P3, P2);      //将前n-1个圆盘由起始柱转到中间柱。
		move(n, P1, P3);             //将第n个圆盘由起始柱转到目标柱。
		Hanoi(n-1, P2, P1, P3);      //将前n-1个圆盘由中间柱转到目标柱。
	}
}

int main()
{
	int n;                     //n为汉诺塔的层数。
	printf("请输入层数:");
	scanf("%d",&n);
	Hanoi(n, 'A', 'B', 'C');
	return 0;
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值