汉诺塔问题
相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置n个金盘。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。
一问:将n个金盘移到C杆上一共移动多少次?
二问:将n个金盘移到C杆上的过程。
问题分析:
以三个金盘为例:
第一步:将第一个金盘移到C杆
第二步:将第二个金盘移到B杆(辅助杆)
第三步:将第一个金盘从C杆移到B杆
第四步:将第三个金盘移到C杆
第五步:将第一个金盘从B杆移到A杆
第六步:将第二个金盘从B杆移到C杆
第七步,将第一个金盘从A杆移到C杆
如图:
当有n个金盘时,先将n-1个金盘移动到B杆(辅助),然后将第n个金盘移动到C杆;此时可以看作有n-1个金盘的汉诺塔问题,我们需要将n-2个金盘移动到A杆(辅助)上,然后将第n-1个金盘移动到C杆上。以此类推。所以我们可以用递归来解决这个问题。
代码:`
#include <stdio.h>
void Hanoi(int n,char A,char B,char C);
int main(){
int n;
char a='A',b='B',c='C';
scanf("%d",&n);
printf("Start move:\n");
Hanoi(n,a,b,c);
}
void Hanoi(int n,char A,char B,char C){
if(n==1){
printf("%c--->%c\n",A,C);
}
else{
//将前面n-1个金盘借助C柱移动到B柱上
Hanoi(n-1,A,C,B);
//将第n个金盘移动到C柱上
printf("%c--->%c\n",A,C);
//将剩下的n-1个金盘借助A柱移动到C柱上(进入n-1个金盘的Hanoi函数)
Hanoi(n-1,B,A,C);
printf("\n");
}
}
运行: