递推问题之汉诺塔问题
汉诺塔问题
设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; }