递归--汉诺塔
题目
假设有abc三个轴,有n个直径不相同,从小到大依次编号的盘子(1,2,,,,n)按照上小下大的顺序放在a轴上,现要求将这n个盘子移动到c轴上,但是移动的时候要保证以下规则:
- 每次只能移动一个盘子,他必须位于一个轴的顶部
- 圆盘可以插在abc任意一个轴上
- 任何时刻都不可以将一个大盘子放在小盘子上
解题思路:
典型的递归方法,我们有n个盘子在a,那么我们需要做的就是
1、把n-1个盘子,借助b轴,从a移到c,(因为此时a轴的第n个盘子是最大的,所以我们不应该担心违背规则)
2、现在a轴只有一个盘子,将其移动到c,
3、把位于b轴的n-1个盘子,借助a移动到c,
一直递归,直到传过来的参数小于1,return(边界条件)
代码
#include<iostream>
#include<cstring>
using namespace std;
//借助b,从a向c移动盘子,
void move(int n,string a,string b,string c)
{
if(n<1) return;
move(n-1,a,c,b); //把a盘上的n-1个盘子,借助c移动到b
cout<<a<<"--->"<<c<<endl; //现在a只有一个盘子,把该盘子移动到c
move(n-1,b,a,c); //把b上面的n-1个盘子,借助a移动到c
}
int main()
{
int n;
cin>>n;
move(n,"a","b","c");
return 0;
}