#include<stdio.h>
int ct = 1; //定义全局变量记录移动步数
void move(int n, char from,char to)//打印盘子移动的具体步骤;
{
printf("第%2d步,移动第%d个盘子从%c>>>%c\n", ct++, n, from, to);
}
int hanoi(int n) //计算总步数
{
if (n < 2)
return 1;
else //无论怎样移动总要将n上前n-1个盘子借助C移动到B // 上,然后再借助A移动到上;
{ //即总步数为 2*T(n-1)+1
return 2 * hanoi(n - 1) + 1;
}
}
void hanoi_pc(int n, char x,char y,char z)//实施步骤
{ // 当盘子数超过两个时总要经历步骤将第n-1个盘子借助C移动到 B
//将n移动到C,再将之后B上的第n-1个盘子借助C移动到A上
if (n == 1)
move(n, x, z);
else
{
hanoi_pc(n - 1, x, z, y);//x为初始针,y为目的针,z为辅助针;
move(n - 1, x, z);
hanoi_pc(n - 1, y, x, z);//这里的 n-1 都代表同一个盘子
}
}
int main()
{
int n = 0 ; //设置盘子变量
int t = 0;
char x = 'A'; char y = 'B'; char z = 'C'; //设置盘针ABC;
printf("请输入汉诺塔中盘子的个数>>");
scanf_s("%d", &n); //获取盘子数给n
t= hanoi(n); //使用函数求解所需要的步数给到t;
hanoi_pc(n,x, y, z); //获取移动的详细步骤;
printf("共需要走%d步\n", t);
return 0;
}