点击蓝字 关注我们
本话内容
请输入
相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如下图)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。请使用C++程序模拟汉诺塔移动金盘的过程。
对于这样一个问题,任何人都不可能直接写出移动盘子的每一步,但我们可以利用下面的方法来解决。
假设移动盘子数为n,为了将这n个盘子从A柱移动到C柱,可以做以下三步:
以C柱为中介,从A柱将n-1个盘子移至B柱;
将底下那个盘子直接从A柱移到C柱;
以A柱为中介,从B柱将n-1个盘子移至C柱;
上面的3个步骤中,第2步可以直接一步完成,而第1步和第3步并不能直接完成,细心研究发现剩下的n-1个圆盘也可以重复再一次执行上面这3个步骤,在这里可以使用递归的方式。另外如果只有一个圆盘,我们可以直接让它从起始位置移动终点,这也就是递归的终止条件。
#include
using namespace std;
// 定义一个自定义函数,参数含义为:
// n表示有多少个圆盘需要移动
// a表示起始位置
// b表示中转站
// c表示目的地
void move(int n, char a, char b, char c) {
// 递归终止条件:当只有一个圆盘时,直接将它从起始位置移到目的地
if (n == 1) {
cout << a << " ------> " << c << endl;
} else {
// 调用自身:将n-1个从a通过c移到b
move(n - 1, a, c, b);
// 将最底下那个圆盘起始位置移到目的地
cout << a << " ------> " << c << endl;
// 调用自身:将n-1个从b通过a移到c
move(n - 1, b, a, c);
}
}
int main() {
int n = 5;
move(n, 'A', 'B', 'C');
return 0;
}
加入“编程玩家俱乐部”知识星球,每天都能学到有意思的编程知识哦。
看漫画学C++
看漫画也能学C++?没错!编程玩家俱乐部新推出系列课程《看漫画学C++》,带你用轻松看漫画的方式来学习C++,本课程面向零基础学员,只要坚持学习并多思考和多练习,相信你一定会成为C++的编程高手!如果喜欢本课程,就收藏一下哦,转发给你的小伙伴们,大家一起来学习!
扫码关注哦
编程玩家俱乐部
微信号 : 编程玩家俱乐部
B站:编程玩家
官网:https://aicodeplayer.com
喜欢本篇内容请给我们点个在看