汉诺塔
今天发现写的代码还是记一下,不然极易忘记,真的蛋疼。
代码
#include<iostream>
using namespace std;
void move(char a,char b,char c,int n);
int main()
{
int n;
char a='A',b='B',c='C';
cout<<"汉诺塔有多少层:";
cin>>n;
move(a,b,c,n);
return 0;
}
void move(char a,char b,char c,int n)
{
if(n==1){
cout<<a<<"到"<<c<<endl;
}
if(n>=2){
move(a,c,b,n-1);
cout<<a<<"到"<<c<<endl;
move(b,a,c,n-1);
}
}
理解
非常简单和经典的一道递归题,就是一开始没转过弯来,其实就是递归就是把问题简化,从n层一步步递归到1层去解决问题,然后再层层递归回来解决上一层的问题。
这道题重点思路就是用来递归的move函数,具体要怎么写呢?首先就是要理解move函数的作用,该函数的作用理解来就是将n个铁块从a塔借助b塔全部移动到c塔上,那么我们要如何完成这个操作呢,这时就要将n设为3块,用较简单的铁块数去推规律,当n=3时,那么就是:
a–>c
a–>b
c–>b
a–>c
b–>a
b–>c
a–>c
可以看出如果要将最大的一块移动到c塔上,则需要a塔铁块里上面的两块首先借助c塔移动到b塔上,即n-1块需要借助c塔移动到b塔上,即move(a,c,b,n-1),然后再移动最后一块,即a–>c,最后则只需要将b塔上的n-1块铁块借助a塔移动到c塔上,即move(b,a,c,n-1),我们就已经把move函数构思好了,这便是汉诺塔的一个共通的规律,将一个复杂的移动操作简化为三部分,然后再将三部分中较复杂的部分继续简化成三部分,就这样一路简化直至n==1,最后得出n层汉诺塔要如何移动才能全部移动到另一个塔上。
其中要注意:n==1这个部分,我时常会写成n=1,真滴蠢。。。