一、汉诺塔题目描述

相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如下图)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。
刷题笔记35——求解汉诺塔、字符串子序列问题

1.1 思路

思路简化,因为我们要把所有的饼从A移到C上(Move all from A to C)

  1. 把A针中的N-1个饼放到针B上,此时help是C针(从A中来,到B中去,借助C)
  2. 把A针的最后一个(名字叫做N)饼放到目标针C上
  3. 把B针的N-1个饼放到C针上,此时help是A针(从B中来,到C中去,借助A)

刷题笔记35——求解汉诺塔、字符串子序列问题

1.2 复杂度分析

T(n) = T(n - 1)+ 1 + T(n - 1)= 2 T(n - 1) + 1,构造等比数列
要打印2n - 1次,于是复杂度是O(2n

1.3 测试代码及结果

刷题笔记35——求解汉诺塔、字符串子序列问题


#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

从空串开始,每一个位置都有两个决策,决定是否加上当前字符
刷题笔记35——求解汉诺塔、字符串子序列问题
刷题笔记35——求解汉诺塔、字符串子序列问题

相关文章:

  • 2021-12-25
  • 2022-12-23
  • 2021-05-21
  • 2022-12-23
  • 2022-12-23
  • 2022-01-08
  • 2022-12-23
猜你喜欢
  • 2021-12-14
  • 2021-10-09
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案