汉诺塔问题解答

汉诺塔的盘子移动过程中目的将盘子从A(初始盘)借助B(借用盘)移动到C(目标盘)。整个过程注意把握两点:
一:一次递归调用中三个盘子分别起到了什么作用。
二:调用以后三个盘子的角色又变换成了什么。
详细分析
(n=2)两个盘子的情况下:
1.第一次调用find函数A盘代表初始盘,B盘代表目标盘,C盘代表借用盘。
2.按照Find函数Find(n, A, B, C)的排列顺序即,A的位置为初始盘,B的位置为借用盘C的位置为目标盘,故第一次调用Find函数的时候传值顺序为find(n-1,A,C, B,);
3.此刻第一次调用已经结束,ABC三个盘的盘片数为A只有n号盘,B有n-1号个盘子,C为0个。
4.此刻调用mov()函数,将A上的n号盘移动到C。
5.此刻第二次调用find函数,但是其中ABC角色已经发生了变化但是Find函数的位置(初始盘,借用盘,目标盘)没有变。故此刻为借用C盘将B盘上的N-1个盘移动到A盘上。再次调用Find函数时传值为find(n-1,B,A, C)。

注意:
1.盘片的功能确定,剩余盘片数所在的盘为初始盘,C盘永远为目标盘,空盘为借用盘。
2.把握一点,函数Find(n剩余盘片数,A初始盘,B借用盘,C目标盘)即可。

#include <stdio.h>
int i=1;
bool  mov (int n,char A,char C)
{
    printf("第%d次,将%d号盘%c------>%c\n",i,n,A,C);
    i++; 
    return true ;
}
bool find(int n,char A,char B,char C)  
{ 
    if (n==1)
    mov (1,A,C);
    else 
    {
        //盘多的为初始盘, 
        //  1.借c把上A上的盘移动到b上,此时A为初始盘,B为目标盘,C为借用盘 
        //  2.把第N个盘从A移动到C上,此时只有一个、n号盘 
        //  3.把B借用A移动到c ,此时A为借用盘B为初始盘,C为目标盘
        find (n-1,A,C,B);
        mov(n,A,C); 
        find (n-1,B,A,C);
    }
    return true;
}  
int main()  
{  
    int n;
    char A='A',B='B',C='C';
    printf ("请输入汉诺塔的盘子数!"); 
    scanf ("%d",&n); 
    find(n,A,B,C); 
    return 0;  
}  

这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值