有A,B,C三根柱子,A柱子上面有若干个盘子,从小到大的一次堆放着(上大下小)
现欲把A上的盘子挪到C上,且遵守大盘子在小盘子之下的原则
递归算法的描述:
我们可以将问题缩小化,总是将n-1个盘子挪到B上,然后将最大的盘子挪到C上
当有两个盘子的时候可以将小的挪到B上,然后将大的挪到C上
有三个的时候,可以将第一个和第二个挪到B上,然后将大的挪到C上
以此类推.....
当有三个时候,将1,2挪到B上,将3,挪到C上,
需要将1,2先挪到B上,我们必须让程序具有一致性,因为程序并不知道那个是A,B,C
由于我们始终都是让A挪到C
所以将B作为C,
A-->B======>>A-->C
然后我们需要将1,2再次挪到C上,
目的地是C,运行的是B-->C,
同上,我们需要将B换成A
所以 B-->C====>>A-->C
替换的时候可以再参数传递的时候实现
算法如下:
#include
void Hanoi(int n,char a,char b,char c)
{
if(n==1) //剩余一个盘子
{
printf("%d 号盘子 %c---->%c",n,a,c);
}else
{
Hanoi(n-1,a,c,b);
printf("%d 号盘子 %c---->%c",n,a,c");
Hanoi(n-1,b,a,c); //始终保持是A--->C
}
}
int main(void)
{
int n;
printf("请输入盘子的总数:");
scanf("%d",&n);
Hanoi(n,'a','b','c');
return 0;
}