汉诺塔问题
汉诺塔的算法就3个步骤:
第一,把a上的n-1个盘通过c移动到b。
第二,把a上的最下面的盘移到c。
第三,因为n-1个盘全在b上了,
所以把b当做a重复以上步骤就好了。所以算法看起来就简单多了。
不过,思考过程还是很痛苦的,难以理解。递归中会保存数据的好处在这里又得到体现
//2014-4-2 23:54 汉诺塔完整程序
//比较难于理解,要反复琢磨
# include <stdio.h>
void hannuota(int n, char A, char B, char C)//此函数代码比较难懂,好好反复想明白
{
/*如果是1个盘子
直接将A柱子上的盘子从A移到C
否则
先将A柱子上的n-1个盘子借助C移到B
然后将A柱子上的盘子从A移到到C
最后将B柱子上的n-1个盘子借助A移到C
*/
if (1 == n )
{
printf("将编号为%d的盘子直接从%c柱子移到%c柱子
", n, A, C);
}
else
{
hannuota(n-1, A, C, B);
printf("将编号为%d的盘子直接从%c柱子移到%c柱子
", n, A, C);
hannuota(n-1, B, A, C);
}
}
int main(void)
{
char ch1 = 'A';
char ch2 = 'B';
char ch3 = 'C';
int n;
printf("请输入要移动盘子的个数:
");
scanf("%d", &n);
hannuota(n, 'A', 'B', 'C');
}
补充:
汉诺塔问题(又称河内塔问题)是根据一个传说形成的一个问题:
有三根杆子A,B,C.A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小.要求按下列规则将所有圆盘移至C杆:
1.每次只能移动一个圆盘;
2.大盘不能叠在小盘上面.
可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须尊循上述两条规则.