一、什么是汉诺塔。
汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
二、怎么使用C语言实现汉诺塔呢?
首先我们思考下:假如有A,B,C三个柱子和n个盘子。那么如果想把A上的n个盘子借助B移动到C上,那么根据规则我们要移动A上的第n盘子到C的最底端时,那么n-1盘子就需要先从A->B上,然后把B上的n-1个盘子借助A移动到C上。所以从A->C n个盘子可以分为以下几步:
① 首先把A上的n-1个盘子借助C移动到B上
② 然后把A上的第n个盘子(也就是现在的最上面的)移动到C上。
③ 最后把B上的n-1个盘子借助A移动到C上。
这样我们就可以发现,我们把n个盘子的操作化为n-1个盘子的操作了。那么,很明显的,我们根据这个来使用递归实现n个盘的移动(注意当n=1时,处理结束为止)。
如以下代码:
/* 借助y,把x上面的n个盘移动到z */
void move(int n, hanstack *x, hanstack *y, hanstack *z)
{
Elemtype tmp=0;
if(n == 1){
pop_stack(x,&tmp);
push_stack(z,tmp);
}else{
/* 先进行把x上面的n-1个盘移动到y上 */
move(n-1, x, z, y);
/* 把x上面的最后一个盘(