问题:
3个塔a、b、c,n个碟子。
初始——所有碟子放在a号塔,大的在底下,小的在上面
任务——把碟子移动到c号塔,顺序不变,可用b号塔辅助
限制——每次只能移动一个碟子,总是大碟子在下,小的在上
思想:递归
移动次数:f(n) = 2*f(n-1)+1 (n>1) -> f(n)=2^n-1
解法:
①把a上的n-1(递归n-2/n-3/n-4/2-1,2-1即两个盘情况)个盘通过c移动到b。
②把a上的最下面的盘移到c
③因为n-1个盘全在b上了,所以把b当做a重复以上步骤就好了(b看成整体、可当作两个盘b->c)
分析:
①只有2个
a->b a->c b->c(一直在递归做这个,只是递归中a、b、c的角色发生了改变)
②多个
如下图a->c a->b c>b (把b上所有和a最上一个看成两个盘,即①时)
a b c
b看成1个,结果而言相当于2个在移动(递归)
代码实现:
#include<stdio.h>
void move(int n,char a,char b,char c)
{
if(n==1)
printf("\t%c->%c\n",a,c);
else
{
move(n-1,a,c,b); //(递归到最后形同两个盘)a->b
//转义字符和格式控制符t:水平制表 /v:垂直制表
printf("\t%c->%c\n",a,c); //(递归到最后形同两个盘)a->c
move(n-1,b,a,c); //(递归到最后形同两个盘)b->c
}
}
main()
{
int n;
printf("请输入数字n(要移动的块数)以解决n阶汉诺塔问题:");
scanf("%d",&n);
move(n,'a','b','c');
while(1);
}