递推问题之汉诺塔问题

汉诺塔问题

  设3根柱子分别为A、B、C,圆盘数目为n。

1:如果A有一个圆盘,则直接移动至c。

 2:如果A有2个圆盘,则A->B,A->C,B->C。

好了这个时候已经可以解决问题了,结束条件为 n==1;

   假设当我们在数目为n-1的时候已经解决了移动问题可以成功移动至C,如果又多了一个呢,即n,我们用同样的方法把圆盘移动至B(我们已经可以把n-1个盘子通过B移动至C了,那么通过C移动至B也一样),为什么移动至B了呢,因为多了个盘子(放在最底部的大盘子),我们要向步骤2一样把上面的n-1个盘子看成一个整体,用上一个方法即移动n-1个盘子的方法把上面的n-1个盘子移动至B,然后把新增的那个大盘子移动至C,然后再用移动n-1个盘子对应的方法把B中的n-1个盘子移动至C,就完成了。

#include <stdio.h>
#include <stdlib.h>
int step=0;
void move(int m,char p,char q,char r){
if(m==1){
    printf("\n[%d] move %d# from %c to %c",step,m,p,r);
    step++;
}
else{
    move(m-1,p,r,q);
       printf("\n[%d] move %d# from %c to %c",step,m,p,r);
       step++;
       move(m-1,q,p,r);
}

}
int main()
{
    int n;
    scanf("%d",&n);
    printf("在3根柱子上移%d只盘的步骤为:n\n",n);
    move(n,'a','b','c');
    printf("\n");
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/qiucomeon/p/9692162.html