2.Q.汉诺塔模型(口述汉诺塔代码)
汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说。有三根柱子ABC,在柱子A上从下往上按照大小顺序摞着N片圆盘。要求把圆盘从下面开始按大小顺序重新摆放在C柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
找规律:
1片 | 2片 | 3片 | 4片 | n片 |
---|---|---|---|---|
1次 | 3种 | 7种 | 15种(2*7+1) | 2*f(n-1)+1 |
证明:
验证n=1,n=2成立;
设n=k-1成立;
证n=k:
每次都分为第k个(最大的一片),和前k-1个。
1、先把A柱上面的(k-1)个圆盘移到B柱。用了f(k-1)次。
2、再把A柱上剩下的那个最大的圆盘移到C柱。用了1次。
3、最后把B柱上的(N-1)圆盘移到C柱。用了f(k-1)次。
∴f(k)=2*f(k-1)+1
代码实现:
1.递归计算移动次数 时间复杂度:O(n) ,空间复杂度:O(n)
#include<iostream>
using namespace std;
int hanoi(int n)
{
if (n == 1)
return 1;
else
return 2 * hanoi(n - 1) + 1;
}
int main()
{
cout<<hanoi(4)<<endl;
return 0;
}
2.递归显示移动方法 时间复杂度:O(2n)
#include <iostream>
#include<cstdio>
using namespace std;
void hanoi(int n, char a, char b, char c)//从a搬到c,b作辅助
{
if (n == 1)
cout << a << "->" << c<<endl;
else
{
hanoi(n - 1, a, c, b);//先把前n-1个,从a搬到b,c作辅助
cout << a << "->" << c<<endl;//再把最后一个,从a搬到c
hanoi(n - 1, b, a, c);//最后把前n-1个,从b搬到c,a作辅助
}
}
int main()
{
char a = 'A', b = 'B', c = 'C';
hanoi(4, a, b, c);
return 0;
}
两个算法结果: