汉诺塔问题:
如上图所示,将N个盘子从A移到C上,每次只能移动一个盘子,且保证任何时候小盘子上都不能放大盘子。
看到这类问题,首先我们可以根据简单的数据进行推理,比如:
1.有3个盘子,我们若需要将3个盘子从A移动到C,那么我们只需要保证先将两个盘子从A移动到B,将最下面的盘子移动到C,再B中的两个盘子移动到C。
2.而如果有4个盘子,那么我们只需要将上面三个盘子从A移动到B,将最下面的盘子移动到C。再将B中的3个盘子移动到C。
此时我们发现了规律:有4个盘子,我们只要模拟出3个盘子移动的过程两次(由A到B,再由B到C),再加上中间一次最大盘子从A到C就可实现。
那么3个盘子移动的整个过程是由A到C的,我们此时需要两次这个过程,第一次需要将3个盘子的移动过程A->C中的C变成B,此时就会变成A->B的结果,完成之后我们需要恢复原态。同理,第二次就是将A变成B。
推理得出:
有N个盘子时,我们只需要知道N-1的过程就可以得出结果。此时使用递归就可以帮我们解决这个问题。
char A='A';
char B='B';
char C='C';
void swap(char *a,char *b)
{
char tmp=*a;
*a=*b;
*b=tmp;
}
void Fun(int n)
{
if(n==2)
{
cout<<A<<"->"<<B<<endl;
cout<<A<<"->"<<C<<endl;
cout<<B<<"->"<<C<<endl;
}
else
{
swap(&B,&C);
Fun(n-1);
swap(&B,&C);
cout<<A<<"->"<<C<<endl;
swap(&A,&B);
Fun(n-1);
swap(&A,&B);
}
}