汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
A表示金片初始的那根柱子,B表示过渡柱,C表示目标柱,看似复杂的问题,实际上可以分为三大步
第1步:将A柱上的n-1个金片通过C柱移动到B柱
第2步:将第n个(最大的)金片从A柱移动到C柱
第3步:将B柱上n-1个金片通过A柱移动到C柱
这样就把移动n个金片转化为移动n-1个金片的问题,即可用移动n-1个金片的问题进行递归描述,从而转化为移动一个金片的问题
用程序实现如下
#include<stdio.h>
int i=0; /*全局变量i,表示移动次数*/
void output(int n,char take,char put); /*声明函数,用于输出步骤*/
void move(int n,char A,char B,char C) /*定义函数,移动金片*/
{
if(n==0) /*n=0时不做处理*/
return;
if(n==1) /*n=1时直接把金片从A移动到C*/
output(n,A,C);
else
{
move(n-1,A,C,B); /*将n-1个金片从A通过C移动到B*/
output(n,A,C); /*将第n个金片从A移动到C*/
move(n-1,B,A,C); /*将n-1个金片从B经过A移动到C*/
}
}
int main()
{
int n; /*一共有n个金片*/
char A='A',B='B',C='C'; /*三根柱子分别定义为A,B,C*/
scanf("%d",&n);
move(n,A,B,C); /*调用函数进行移动操作*/
return 0;
}
void output(int n,char take,char put)
{
i++; /*每次移动,i的值增加1*/
printf("[%d] move%d: %c-->%c\n",i,n,take,put);
}
例如我们输入3,结果如下