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