汉诺塔问题 | HanoiTower Recursion Algorithm

1-23 汉诺塔问题

问题描述

From Baidu Bake

相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如图1)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。
汉诺塔问题,是心理学实验研究常用的任务之一。该问题的主要材料包括三根高度相同的柱子和一些大小及颜色不同的圆盘,三根柱子分别为起始柱A、辅助柱B及目标柱C。 
规则:
每次只能移动一个盘子
移动中三根杆大盘在下小盘在上

问题体验

https://zhangxiaoleiwk.gitee.io/h.html // 体验Hanoi网站

问题解决方法

(1)以C盘为中介,从A杆将1至n-1号盘移至B杆;
(2)将A杆中剩下的第n号盘移至C杆;
(3)以A杆为中介;从B杆将1至n-1号盘移至C杆

我们不妨定义汉诺塔问题为从source盘移动到 target 盘以 Buffer为辅助盘的问题

#define SOURCE // 标识 源
#define BUFFER // 标识 中介
#define TARGET // 标识 目标
void Hanoi
汉诺塔问题源自印度古老传说,印度教“创造之神”梵天创造世界时做了 3 根金刚石柱,其中一根柱子上按从小到大顺序摞着 64 个黄金圆盘,需将所有圆盘移动到另一个柱子上,规则是每次只能移动柱子最顶端的一个圆盘,且每个柱子上小圆盘永远位于大圆盘之上[^3]。 使用 C++ 递归解决汉诺塔问题的思路如下: - 当 n = 1 时,直接把盘子从起始柱移动到目的柱。 - 当 n>1 时,把 n 分解成 n - 1 和 1 的汉诺塔问题。先将 n - 1 个盘子经过目的柱移动到辅助柱,然后把起始柱最下面的盘子直接移动到目的柱,最后再把 n - 1 个盘子经过起始柱移动到目的柱。 以下是使用 C++ 实现递归解决汉诺塔问题的代码: ```cpp #include<bits/stdc++.h> using namespace std; // 汉诺塔 // m --> 几个盘子 // 第一位变量 from 定义为起始柱,第二位变量 to 定义为目的柱,第三位变量 help 定义为辅助柱 // 起始柱、目的柱、辅助柱三个位置顺序的含义:把盘子从起始柱移动到目的柱,通过辅助柱的帮助 // from、to、help 被赋值 A、B、C 后,含义不变,如: // HanoiTower(A,B,C); 含义:盘子从 A 移到 B,通过 C 的帮助 <==> HanoiTower(from,to,help); // HanoiTower(A,C,B); 含义:盘子从 A 移到 C,通过 B 的帮助 <==> HanoiTower(from,help,to); void HanoiTower(int m, string from, string to, string help) { if (m == 1) cout << m << " from " << from << " to " << to << endl; else { HanoiTower(m - 1, from, help, to); // A,C,B 将前 m - 1 个盘子从 A 移动到 C cout << m << " from " << from << " to " << to << endl; // A,B 将第 m 个盘子从 A 移到 B HanoiTower(m - 1, help, to, from); // C,B,A 将第 m - 1 个盘子从 C 移到 B // 此时 1 --> m - 2 个盘子全在 A 柱上,可重复递归 } } int main() { int m; cin >> m; HanoiTower(m, "A", "B", "C"); // 初始定义——from:A. to:B. help:C. return 0; } ``` 该代码中,`HanoiTower` 函数实现了递归解决汉诺塔问题的逻辑。在 `main` 函数中,通过用户输入盘子的数量 `m`,然后调用 `HanoiTower` 函数进行求解[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值