从左到右有 A、B、C 三根柱子,其中 A 柱子上面有从小叠到大的 n 个圆盘,现要求将 A 柱子上的圆盘移到 C 柱子上去,期间只有一个原则:一次只能移到一个盘子且大盘子不能在小盘子上面,求移动的步骤和移动的次数。
首先我们要明确三个限制条件:
- 大盘子不能放在小盘子上
- 每回只能移动一个盘子
- 只能移动最顶端的盘子
递归是最优雅的解决方案。
汉诺塔问题归根结底就是在递归三个步骤,这很符合递归的思想。
三步走:
第一步:将 n-1 个盘子移到 B
第二步:将 1 个盘子移到 C
第三步:将 n-1 个盘子移到 C
//汉诺塔问题
#include <iostream>
using namespace std;
//把n个盘子从A->C
void f(int n, char a = 'A',char b = 'B' ,char c = 'C')
{
if (n == 0) return;
f(n-1,a,c,b);
printf("把第%d个盘子,从%c柱子移动到%c柱子\n",n,a,c);
f(n-1,b,a,c);
}
int main()
{
int n;
cin>>n;
f(n);
return 0;
}