- 题目要求:
一块板上有三根针,A,B,C。从A针上套有N个大小不等的圆盘,大的在下,小的在上,现在要将这N个盘子从A针移动到C针上,每次只能移动一个盘子,可以利用B针,但在任何情况下,任何针上的圆盘必须保证大盘在下,小盘在上的原则。
2.实现思路:
运用递归的思想。想一想把大象放进冰箱需要几步,仅仅三步,同样这种思路也是,每一步骤分三步走:(1)先将第1~n-1个盘子移动到B盘上,(2)再将最底层的第N个盘子移动到C针上,(3)最后将B针上的n-1个盘子移动到C针上,这样问题不就解决了,但难就难在如何实现第(1)(3)步,由于每一次只能移动一个盘子,所以在移动的过程中显然要借助另一个针,即第(1)步将1到n-1个盘子借助C针移动到B针上;第(3)步要将B针上的n-1个盘子借助A针移动到C针上,这样显然又是两个新汉诺塔问题了
Q1:将1到n-2个盘子借助C针移到B针上
Q2:要将B针上的n-1个盘子借助A针移动到C针上
解决Q1:(1)将A针上的第1到62个盘子借助B针移到到C针上
(2)再将第n-1个盘子移到B针上
(3)最后将C针上的n-2个盘子借助A针移到B针上
解决Q2:(1)将B针上的第1到n-2个盘子借助C针移到到A针上
(2)再将第n-1个盘子移到C针上
(3)最后将A针上的n-2个盘子借助B针移到C针上
同样的,上面的两个问题也是新的汉诺塔问题,解决的思路还是一样,显然是递归的思想,而递归的终止条件便是第(1)步和第(3)步所移动的盘子个数为1个为止。
-实现函数:
设计一个函数move(int n,char a,char b,char c)表示的意思就是将n个盘子从a针上借助b针移动到c针上
void move(int n,char a,char b,char c)
{
if(n==1)
printf("%c-->%c\n",a,c);
else{
move(n-1,a,c,b); //先将n-1个盘子从a针借助c针移到b针上,然后将第n个盘子直接移到c针上,也就是显示移动过程a->c
printf("%c-->%c\n",a,c);
move(n-1,b,a,c); //最后将b上的N-1个盘子通过a针移到c针
}
}
主函数调用部分:
int main(){
int n;
printf("请输入盘子的数目:\n");
scanf("%d",&n);
move(n,'A','B','C');
return 0;
}
程序结果如图:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191025221040834.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1MTQxNjgy,size_16,color_FFFFFF,t_70
这样就实现了经典的递归问题,汉诺塔问题
这是小白粗略见解,一定存在许多不足之处,希望大佬多指教!!!