目录:
- 引言
- 一、问题描述
- 二、问题求解
- 三、测试
- 四、附录(所有代码)
引言
这个汉诺塔问题就是一个典型的递归问题,这篇博客也算是上一篇的一个扩展吧,都是递归问题,这个问题太大,而且牵扯到的问题太多,没办法一次说完(说完也太长了),所以就按问题展开来总结。
一、问题描述
问题:有A,B,C三个柱子,需要把A中的盘子,按如A中的顺序移到C柱子上,要求每次只能移动一个盘子,
且每根柱子必须是小的在上大的在下
二、问题求解
本代码意思为,把所有移动的动作给打印了出来,eg:A->B意思为把A柱子最上面的盘子移动到B柱子上。
时间复杂度为O(2^n)
void Hanoi(int n, const char* start, const char* mid, const char* end) //n代表start所剩盘子数
{if (n == 1) //如果当前只剩一个盘子了,那么直接移动{cout << start << "->" << end << endl;return;}Hanoi(n - 1, start, end, mid); //先把前n-1个盘子移动到mid柱子cout << start << "->" << end << endl; //再把第n个盘子移动到end柱子Hanoi(n - 1, mid, start, end); //最后把前n-1个盘子从mid柱子移动到end柱子
}
三、测试
所得结果正确
int main()
{Hanoi(3, "A", "B", "C");return 0;
}
四、附录(所有代码)
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cmath>
#include<cstring>
#include<string>
#include<stdlib.h>
#include<stdexcept>
#include<exception>
#include<new>
#include<typeinfo>
#include<fstream>
#include<sstream>
#include<vector>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<unordered_map>
#include<unordered_set>
#include<algorithm>
#include<numeric>
#include<ctype.h>
#include<memory>
#include<functional>
#include<thread>
#include<mutex>
#include<condition_variable>
using namespace std;void Hanoi(int n, const char* start, const char* mid, const char* end) //n代表start所剩盘子数
{if (n == 1) //如果当前只剩一个盘子了,那么直接移动{cout << start << "->" << end << endl;return;}Hanoi(n - 1, start, end, mid); //先把前n-1个盘子移动到mid柱子cout << start << "->" << end << endl; //再把第n个盘子移动到end柱子Hanoi(n - 1, mid, start, end); //最后把前n-1个盘子从mid柱子移动到end柱子
}int main()
{Hanoi(3, "A", "B", "C");return 0;
}