递归——汉诺塔(西南交大网站版)

作为一个西南交大计算机的大一新生,每次网站查看答案都要花10个金币,于是我决定将网站的答案写下来(不是标答,本人自己写的)造福大家。有问题欢迎指正TT

*汉诺塔问题是一个著名的问题,初始模型如图所示。其来源据说是在约19世纪末欧洲的商店中出售一种智力玩具,在一块铜板上有三根杆,最左边的杆自上而下、由小到大顺序串着64个圆盘构成的塔,游戏的目的是将最左边A杆上的圆盘,借助最右边的C杆,全部移动到中间的B杆上,条件是一次仅能移动一个盘,且不允许大盘放在小盘的上面。

**输入格式要求:"%d" 提示信息:"Please enter the number of discs:"
**输出格式要求:"\tTotal:%d\n"    "%2d-(%2d):%c==>%c\n" 
程序运行示例如下: 
Please enter the number of discs: 
Please enter the number of discs: 5 
 1-( 1):a==>b 
 2-( 2):a==>c 
 3-( 1):b==>c 
 4-( 3):a==>b 
 5-( 1):c==>a 
 6-( 2):c==>b 
 7-( 1):a==>b 
 8-( 4):a==>c 
 9-( 1):b==>c 
10-( 2):b==>a 
11-( 1):c==>a 
12-( 3):b==>c 
13-( 1):a==>b 
14-( 2):a==>c 
15-( 1):b==>c 
16-( 5):a==>b 
17-( 1):c==>a 
18-( 2):c==>b 
19-( 1):a==>b 
20-( 3):c==>a 
21-( 1):b==>c 
22-( 2):b==>a 
23-( 1):c==>a 
24-( 4):c==>b 
25-( 1):a==>b 
26-( 2):a==>c 
27-( 1):b==>c 
28-( 3):a==>b 
29-( 1):c==>a 
30-( 2):c==>b 
31-( 1):a==>b 
    Total:31

以下为代码:


//汉诺塔问题
//思路:
//不妨假设一共有n个盘子需要从A借助C到B上
//第一步:将n-1个盘子借助B到 C上
//第二步:将最后一个挪到B上
//第三步:将C上的n-1个借助A放到B上 
#include <stdio.h>
int total=0;
void hannuo(int n,char a,char b,char c){ //表示有n个借助c从a到b 
	if(n==1){
		printf("%2d-(%2d):%c==>%c\n",++total,n,a,b); 
	}else{
		hannuo(n-1,a,c,b);
		printf("%2d-(%2d):%c==>%c\n",++total,n,a,b);
		hannuo(n-1,c,b,a);
	}
}
int main() {
	int n;//分别表示一共需要挪动的盘子,总共操作数,操作时所挪动的盘子的标号 
	printf("Please enter the number of discs:"); 
	scanf("%d",&n);
	hannuo(n,'a','b','c');
	printf("\tTotal:%d\n",total); 
	return 0;
}

ps:参照的时候可以看看注释。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值