题目要求:
一块板上有三根针,A,B,C。A针上套有64个大小不等的圆盘,大的在下,小的在上。如下图所示。要把这64个圆盘从A针移动C针上,每次只能移动一个圆盘,移动可以借助B针进行。但在任何时候,任何针上的圆盘都必须保持大盘在下,小盘在上。求移动的步骤。
这是一道非常经典的数学题和程序算法题,上学期间老师讲解数学归纳法,通过等比数列可行运行次数的规律是-1。若我们用编程的方式去解决汉诺塔,采用递归算法完成,并且记录执行的顺序,请看如下代码。
Hanoi塔示意图
#include <stdio.h>
#include <math.h>
static unsigned long number=0;//搬运次数
move(int n,char x,char y,char z)
{
if(n==1)
{
number ;
printf("%c-->%c\n",x,z);
}
else
{
move(n-1,x,z,y); // A C B
printf("%c-->%c\n",x,z);
move(n-1,y,x,z); // B A C
number ;
}
}
int main(void)
{
int n;
unsigned long sum;
printf("input diskes number:\n");
scanf("%d",&n); /*输入盘子数目n*/
printf("The step to moving %d diskes:\n",n);
move(n,'A','B','C'); /*递归调用move(),求解盘子的搬运过程*/
printf("Handling times=%d\r\n",number);//搬移次数
//printf("n=%d\n",n);
sum=pow(2,n)-1;
printf("Handling times=%d\r\n",sum);//搬移次数
getche();
return 0;
}
运行结果:
运行结果
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved