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