汉诺塔(c)详解

简介:

相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如图1)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。

分析问题:

汉诺塔问题无疑就是将盘子按照一定的规律进行移动,可以进行列举

 一个汉诺塔:A--->C

两个汉诺塔:A--->B,A--->C,B--->C,但是本质上从B借道通过到达C所以可以看作A--->C

三个汉诺塔若用两个汉诺塔的借道可以看作:

(A--->C,A---B,C---B)=A---B        A---C=A---C        (B---A,B---C,A---C)=B---C

以此类推n个汉诺塔也可以看作A--->B,A--->C,B--->C

代码 :

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void move( char a, char b)
{
	printf("%c-->%c\n", a, b);
}
void hnt(int num, char a, char b,char c)
{
	if (num == 1)
	{
		move(a, c);//如果只有一层汉诺塔直接a--->c
	}
	else//n层汉诺塔和n-1汉诺塔相似
	{
		hnt(num - 1, a, c, b);
		move(a, c);
		hnt(num - 1, b, a, c);
	}//可以带入两层汉诺塔更直观
}
int main()
{
	int a = 0;
	printf("打印层数:");
	scanf("%d", &a);
	hnt(a, 'a', 'b', 'c');
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值