目录
问题描述
相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。其中,A为起始杆,B为中转杆,C为终点杆。将金盘从小到大分别记为1号,2号,...,64号(整理自百度百科)
代码框架
void move(char ori,char des,int index)//打印移动过程,ori为起点,des为终点,index为盘子编号
{
printf("把%d号盘子从%c移动到%c\n",index,ori,des);
}
void hanio(char A,char B,char C,int n)//递归函数,其中A为起点,B为中转,C为终点
{
}
解决方法
我们先来讨论金盘数等于1(即基线条件)的情况。此时,我们发现,只需要将1号金盘从A杆移动到C杆即可完成任务。
if(n==1)//基线条件
move(A,C,n);
然后在讨论金盘数等于n的情况,我们可以先逐层递归,将n-1个盘子移动到B杆(此时会再讨论n-2的情况,最后一定会讨论1的情况),再将n号盘子移动到C杆,最后将B杆的n-1个盘子移动到C盘
else//递归条件
{
hanio(A,C,B,n-1);
move(A,C,n);
hanio(B,A,C,n-1);
}
完整代码
#include "stdio.h"
void move(char ori,char des,int index);
void hanio(char A,char B,char C,int n);
main()
{
int n;
char X='A',Y='B',Z='C';
printf("请输入盘子数量\n");
scanf("%d",&n);
hanio(X,Y,Z,n);
}
void move(char ori,char des,int index)//打印移动过程,ori为起点,des为终点,index为盘子编号
{
printf("把%d号盘子从%c移动到%c\n",index,ori,des);
}
void hanio(char A,char B,char C,int n)
{
if(n==1)//基线条件
move(A,C,n);
else//递归条件
{
hanio(A,C,B,n-1);
move(A,C,n);
hanio(B,A,C,n-1);
}
}