问题背景
相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如图1)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。
解决方案
#include <stdio.h>
void move(int a,int b){
printf("%d --> %d",a,b);
printf("\n");
}
void hanoi(int n,int a,int b,int c){ //将n的盘中从借助c柱子从a柱子移动到b柱子
if(n>0){
hanoi(n-1,a,c,b); //将这n个盘子上面的n-1个盘子从a柱子通过柱子b移动到柱子c中 (移动到中间柱子上)
move(a,b); //将下面的这一个盘子从a柱子移动到b柱子上 (最底部的盘中移到目标柱子上)
hanoi(n-1,c,b,a); //将之前移动到c柱子上的n-1个盘中移到b柱子上 (将中间柱子的盘子移到目标柱子上)
}
}
int main(){
hanoi(3,1,2,3);
return 0;
}