汉诺塔问题
起源
汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
抽象为数学问题
如下图所示,从左到右有 A、B、C 三根柱子,A 柱子上面有
汉诺塔的原理
如果要将 A 柱的盘子移到 C 柱上,就必须上面
要解决
解题步骤
- 递归
#include<iostream> using namespace std; /** * @param n 汉诺塔的层数(即盘子的个数) * @param a 原来的塔 * @param b 辅助塔 * @param c 目标塔 */ static int cnt = 0; void move(int n, string a, string b){ cout << ++cnt << ": " << "move disk " << n << " from " << a << " to " << b << endl; } void hanNuoTa(int n, string a, string b, string c){ // 当盘子只有一个时 if (n == 1) move(1, a, c); else{ // 将 n-1 个盘子从塔 A 移到塔 B hanNuoTa(n - 1, a, c, b); // 将第 n 个盘子从塔 A 移到塔 C move(n, a, c); // 将 n-1 个盘子从塔 B 移到塔 C hanNuoTa(n - 1, b, a, c); } } int main(){ hanNuoTa(3, "A", "B", "C"); return 0; }
- 递推
设
#include<iostream> #include<vector> using namespace std; int main(){ int n = 3; vector<int> d(n); d[0] = 1; for (int i = 1; i < n; ++i) d[i] = d[i - 1] * 2 + 1; cout << d[n-1] << endl; return 0; }
本文作者:点雨小镇
本文链接:https://www.cnblogs.com/raintown/p/17223829.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步