用C语言实现汉诺塔的移动过程以及移动的次数
题目说明
一共有三个柱子,在一个柱子上穿有若干个圆盘,这些圆盘按下大上小叠放,将这个柱子上的圆盘按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
问题要求
用C语言实现汉诺塔的移动过程以及统计移动的次数
样例参考
样例输入:输入盘子的数量n
3
样例输出
a --> c
a --> b
c --> b
a --> c
b --> a
b --> c
a --> c
移动次数:7
C语言代码
#include<stdio.h>
#include<stdlib.h>
int count=0;
void Move(char getone,char putone)
{
printf("%c --> %c \n",getone,putone); //显示步骤
count++; //统计步数
}
void hannuota(int n,char a,char b,char c)
{
if(n==1)
Move(a,c);
else
{
hannuota(n-1,a,c,b); //将 a 中除了底牌外其余小的的通过 c 暂时放在 b
Move(a,c); //将 a 中底牌直接放在 c
hannuota(n-1,b,a,c); //将 b 中的所有小的牌通过 a 放在 c 中底牌的上面
}
}
int main()
{
int m,g=0;
scanf("%d",&m);
hannuota(m,'a','b','c');
printf("移动次数:%d\n",count);
return 0;
}
步数总结
1个圆盘的时候 1 --> 2的1次方减1 2个圆盘的时候 3 --> 2的2次方减1 3个圆盘的时候 7 --> 2的3次方减1 4个圆盘的时候 15 --> 2的4次方减1 5个圆盘的时候 31 --> 2的5次方减1 ………… 所以当盘子有n个时,移动的次数为:2 的 n 次方减 1