汉诺塔问题解答

来源:互联网 发布:初级linux运维面试题 编辑:程序博客网 时间:2024/05/13 06:24

汉诺塔的盘子移动过程中目的将盘子从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;  }  

这里写图片描述