问题描述
汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。
大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。
大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。
并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
问题解决方案
-
将n个盘子从A座移到C座可以分解为以下3个步骤: (1) 将A座上n-1个盘借助C座移到B座上; (2) 把A座上剩下的一个盘移到C座上; (3) 将n-1个盘从B座借助于A座移到C座上。
-
上面3个步骤分成两类操作: (1) 将n-1个盘子从一个座移到另一个座上(n>1)。
它是一个递归的过程,即和尚将任务层层下放,直到第64个和尚为止。
(2)将1个盘子从一个座上移到另一座上。
关键代码实现
void hanoi(int n,char one,char two,char three)
// 将n个盘从one座借助two座,移到three座
{
void move(char x,char y); //对move函数的声明
if(n == 1) move(one,three);
else
{
hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
}
}
void move(char x,char y)
{
printf("%c-->%c\n",x,y);
}