递推问题之汉诺塔问题

Posted qiucomeon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递推问题之汉诺塔问题相关的知识,希望对你有一定的参考价值。

汉诺塔问题

  设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("
[%d] move %d# from %c to %c",step,m,p,r);
    step++;
}
else{
    move(m-1,p,r,q);
       printf("
[%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);
    move(n,‘a‘,‘b‘,‘c‘);
    printf("
");
    return 0;
}

 

以上是关于递推问题之汉诺塔问题的主要内容,如果未能解决你的问题,请参考以下文章

汉诺塔VII(递推,模拟)

递推递归组合数,汉诺塔,回文数问题(java)

HDU1207 汉诺塔II(递推)

HDU 1207 汉诺塔II (递推)

Acwing-96-奇怪的汉诺塔(递推)

96. 奇怪的汉诺塔递推