给定一个由n个圆盘组成的塔,这些圆盘按照大小递减的方式套在第一根桩柱上。现要将整个塔移动到另一根桩柱上,每次只能移动一个圆盘,且较大的圆盘在移动过程中不能放置在较小的圆盘上面。
输入格式:
输入由四行: 第一行是圆盘数量n(1<=n<=10); 第二行到第四行分别是三根桩柱的名字(字符串),n个盘子套在第一根桩柱上。
输出格式:
输出移动步骤,每行输出一步。
输入样例:
在这里给出一组输入。例如:
2
a
b
c
结尾无空行
输出样例:
在这里给出相应的输出。例如:
a->b
a->c
b->c
结尾无空行
#include<stdio.h>
void 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("%d\n",&n);
scanf("%s\n%s\n%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->%s\n",m,p);//利用该函数进行输出
}
刚开始的时候感觉无从下手,思考了很长时间也没有相关的思路,直到开始想到这是一个函数的嵌套过程。
一、将1上的n-1个圆盘经3的辅助转移到2上
二、将1上的n个圆盘转移到3上
三、将2上的n-1个圆盘经1转移到3上
以上分别对应函数的三部分,再进行函数对自己进行的递归调用