算法入门 - - - 汉诺塔问题
问题描述:一块板上有三根针 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;
}