算法入门 - - - 汉诺塔问题

算法入门 - - - 汉诺塔问题

问题描述:一块板上有三根针 A、B、C。A 针上套有 64 个大小不等的圆盘,按照大的在下、小的在上的顺序排列,要把这 64 个圆盘从 A 针移动到 C 针上,每次只能移动一个圆盘,移动过程可以借助 B 针。但在任何时候,任何针上的圆盘都必须保持大盘在下,小盘在上。从键盘输入需移动的圆盘个数,给出移动的过程。
方法:递归法

//2021.7.18  Author@: kiki_go

/****【递归算法思想】****/

#include<stdio.h> 

int han_no_ta_1(int sum,char start,char temp,char aim);
int han_no_ta_2(int sum,char start,char temp,char aim);

void  main(void)
{
	int sum,count;
	char a='a',b='b',c='c';
	printf("请输入盘子总个数:");
	scanf("%d",&sum);
	printf("移动过程如下:\n");
//	count=han_no_ta_1(sum,'a','b','c'); 
	count=han_no_ta_2(sum,'a','b','c'); 
	printf("\n共移动 %d 次盘子!\n",count);
	return 0; 
}
/* 【作用】     :汉诺塔求解函数
 * 【parameter】: sum:盘子数目,start:起始的盘子,temp:中转的盘子,aim:目标盘子 
 * 【return】   :count:盘子移动的次数 
 * 【备注】     : han_no_ta_1和  han_no_ta_2 效果相同 
 */
int han_no_ta_1(int sum,char start,char temp,char aim)
{
	int count=0;
	if( (sum-1)!=0 )count += han_no_ta_1(sum-1,start,aim,temp);
	printf("%c --> %c\n",start,aim);
	count++;
	if( (sum-1)!=0 )count += han_no_ta_1(sum-1,temp,start,aim);
	return count;
}

int han_no_ta_2(int sum,char start,char temp,char aim)
{
	int count=0;
	if(sum==1)
	{
		printf("%c --> %c\n",start,aim);
		count=1;
	}
	else
	{
		count += han_no_ta_2(sum-1,start,aim,temp);
		printf("%c --> %c\n",start,aim);
		count++;
		count += han_no_ta_2(sum-1,temp,start,aim);	
	}
	return count;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值