汉诺塔问题,是三根高度相同的柱子和一些大小及颜色不同的圆盘,三根柱子分别为起始柱A、辅助柱B及目标柱C。
要求:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。
我们可以将问题简化,移动过程可以分为三步骤(假设有n个盘子):
1.先将前n-1个圆盘从起始柱A移动到辅助柱B上
2.再将第n个圆盘从起始柱A移动到目标柱C上
3.最后再将辅助柱B上的n-1个圆盘移动到目标柱C上
移动结束
#include<stdio.h>
int num = 0;
void Move(char x,char y)
{
num++; //计数器
printf("%c->%c\n",x,y);
}
void Hanoi(int n,char a,char b,char c)
{
if(n==1)
{
Move(a,c);
}
else
{
Hanoi(n-1,a,c,b); //先将前n-1个圆盘从起始柱A移动到辅助柱B上
Move(a,c); //再将第n个圆盘从起始柱A移动到目标柱C上
Hanoi(n-1,b,a,c); //最后再将辅助柱B上的n-1个圆盘移动到目标柱C上
}
}
int main()
{
Hanoi(4,'a','b','c');
printf("%d\n",num);
}