用C语言实现汉诺塔的移动过程以及移动的次数

题目说明

一共有三个柱子,在一个柱子上穿有若干个圆盘,这些圆盘按下大上小叠放,将这个柱子上的圆盘按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

问题要求

用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

小白作者声明:以上代码及图解仅供参考,若有不足请大神留言评论!

相关文章: