递归设计(01)汉诺塔问题

问题描述

古代有一个梵塔,塔内有3个基座分别为A,B,C,开始时A基座上有64个盘子,盘子大小不等,大的在下面,小的在上面(如下图所示)。有一个老和尚想把这64个盘子从A基座移动到C基座,但每次只允许移动一个盘子,且在移动过程中,3个基座上的盘子都始终保持大盘在下面,小盘在上。在移动过程中可以利用B基座做辅助。请编程打印出移动方案。

算法设计

 

 代码编写

/*************************
*
*第一个塔为初始塔,中间的塔为借用塔,最后一个塔为目标塔
*
*/

#include <stdio.h>

char x='A',y='B',z='C';//ABC三个基座
int n;//盘子的个数
int step=1;//记录步数,表示目前正在移动盘子的是第几步

void init();
void move(int n,char from,char to); 
void hanoi(int n,char from,char denpend_on,char to) ;

void init(){
	
	printf("请输入A基座盘子的个数:\n");
	
	scanf("%d",&n); 
	
	printf("盘子移动情况如下:\n");
} 

/****************
*移动函数,表示把第n个盘子从某一个座from移动到另外一个座to
****************/
void move(int n,char from,char to) {
	
	printf("第 %d 步:将 %d 号盘子从 %c 移动到 %c \n",step++,n,from,to);
}

/**************
*将n个盘子由初始塔移动到目标塔(利用借用塔)
***************/
void hanoi(int n,char from,char denpend_on,char to) { 
	if (n==1)
		move(n,from,to);//只有一个盘子是直接将初塔上的盘子移动到目的地
	else {
		hanoi(n-1,from,to,denpend_on);//先将初始塔的前n-1个盘子借助目的塔移动到借用塔上
		move(n,from,to);              //将剩下的一个盘子移动到目的塔上
		hanoi(n-1,denpend_on,from,to);//最后将借用塔上的n-1个盘子移动到目的塔上
	}
}

int main() {
	
	init();
	hanoi(n,x,y,z);
	return 0; 
	
}

打印结果

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值