现在有三个柱子,a ,b, c; a上有n个盘子,从上到下盘子的大小依次增大。现在要让a上的所有盘子移动到c上(小盘子只能在大盘子的上),要求输出每次移动的路径。
这种题呢,就是递归问题,很简单的。
假如n=3,那么路径就是a->c,a->b,c->b,a->c,b->a,b->c,a->c;
那么如果是n个呢,我们知道大盘子一定在下面,那么我们就必须让最大的放在c上,那么当移动到a上只有1个盘子的时候,此时c上必须是空的,这也就意味着,有n-1个盘子在b上面;所以问题就转化成为有n-1个盘子在a上,现在要把它移动到b上,输出每次移动路径。也就是把n-1个盘子先移动到b,然后把最大的从a移到c,最后把n-1个盘子从b移到c,这样问题就解决了。
废话不多说,直接放代码:
#include<stdio.h>
#include<string.h>
void move(char a,char b)
{
printf("%c->%c\n",a,b);
}
void tower(int n,char a,char b,char c)
{
if(n==1) move(a,c);
else
{
tower(n-1,a,c,b);
move(a,c);
tower(n-1,b,a,c);
}
}
int main()
{
int n;
char a,b,c;
while(~scanf("%d",&n))
{
a='a';
b='b';
c='c';
tower(n,a,b,c);
}
return 0;
}