一、汉诺塔题目描述
相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如下图)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。
1.1 思路
思路简化,因为我们要把所有的饼从A移到C上(Move all from A to C)
- 把A针中的N-1个饼放到针B上,此时help是C针(从A中来,到B中去,借助C)
- 把A针的最后一个(名字叫做N)饼放到目标针C上
- 把B针的N-1个饼放到C针上,此时help是A针(从B中来,到C中去,借助A)
1.2 复杂度分析
T(n) = T(n - 1)+ 1 + T(n - 1)= 2 T(n - 1) + 1,构造等比数列
要打印2n - 1次,于是复杂度是O(2n)
1.3 测试代码及结果
#include <iostream>
#include <string>
using namespace std;
void process(int N, string from, string to, string help) {
if (N == 1) {
cout << "Move " << N << " from " << from << " to " << to << endl;
}
else {
process(N - 1, from, help, to);
cout << "Move " << N << " from " << from << " to " << to << endl;
process(N - 1, help, to, from);
}
return;
}
void hanoi(int N) {
process(N, "左", "右", "中");
}
int main() {
int N = 3;
cout << N << " 层汉诺塔问题:\n";
hanoi(N);
return 0;
}
二、字符串子序列
求一个字符串的子序列。注意,子序列和子串是不一样的
- 子序列:不一定要连着。如abc的子序列可以是ac
- 子串:一定要连着。如abc的子串不能是ac
从空串开始,每一个位置都有两个决策,决定是否加上当前字符