给定一个由n个圆盘组成的塔,这些圆盘按照大小递减的方式套在第一根桩柱上。现要将整个塔移动到另一根桩柱上,每次只能移动一个圆盘,且较大的圆盘在移动过程中不能放置在较小的圆盘上面。
输入格式:
输入由四行: 第一行是圆盘数量n(1<=n<=10); 第二行到第四行分别是三根桩柱的名字(字符串),n个盘子套在第一根桩柱上。
输出格式:
输出移动步骤,每行输出一步。
输入样例:
在这里给出一组输入。例如:
2 a b c
结尾无空行
输出样例:
在这里给出相应的输出。例如:
a->b a->c b->c
结尾无空行
#includevoid output(char m[], char p[]); void swop(int n,char m[],char p[],char q[]); int main() { char m[1000],p[1000],q[1000]; int n; scanf("%dn",&n); scanf("%sn%sn%s",&m,&p,&q); swop(n,m,p,q); return 0; } void swop(int n,char m[],char p[],char q[]) { if(n==1) { output(m,q); } else { swop(n-1,m,q,p);//在该函数中,首先二三交换位置,然后一三交换位置 ,同时利用n-1 的操作将高阶的汉诺塔问题转化为低阶的问题 output(m,q); swop(n-1,p,m,q); }//利用函数的递归调用和嵌套调用,在定义的swop函数中用到上面定义的output函数 } void output(char m[],char p[]) { printf("%s->%sn",m,p);//利用该函数进行输出 }
刚开始的时候感觉无从下手,思考了很长时间也没有相关的思路,直到开始想到这是一个函数的嵌套过程。
一、将1上的n-1个圆盘经3的辅助转移到2上
二、将1上的n个圆盘转移到3上
三、将2上的n-1个圆盘经1转移到3上
以上分别对应函数的三部分,再进行函数对自己进行的递归调用



