
汉诺塔 C++实现【STL stack】
首行输入3,接下来是用1, 2, 3代表他的大小等级。 是不是挺形象生动的。
发布日期:2021-05-07 23:08:02
浏览次数:14
分类:精选文章
本文共 2524 字,大约阅读时间需要 8 分钟。
首先我们对题目重现:
汉诺塔:汉诺塔(Tower of Hanoi)源于印度传说中,大梵天创造世界时造了三根金钢石柱子,其中一根柱子自底向上叠着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小.要求按下列规则将所有圆盘移至C杆: 1.每次只能移动一个圆盘; 2.大盘不能叠在小盘上面. 可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须尊循上述两条规则。 求移动的过程。 在这里我们对他的移动过程具象化,达到这样的效果:
算法思考:
对于汉诺塔,我们用的是递归的思想。对于N层的汉诺塔,我们只需要将前n-1层的汉诺塔移到B柱上,接下来将第n层移动到C,接着,将前n-1的汉诺塔移动到C上。因为越往底层,移动次数越少,所以在对前n-1项进行分析的时候,不需要对下层的进行管理。
代码实现:
首先是C++ 的基本框架:
#includeusing namespace std;int main() { turn 0;}
在这里为了方便管理,所以用到了栈来进行数据储存,并且方便后面的运算,我们将栈放到主函数外面。
#include#include using namespace std;int num;stack a, b, c;//三个塔int main() { cin >> num;// 输入汉诺塔层数 for (int i = num; i > 0; i--) // 将A塔填充完毕 a.push(i); turn 0;}
接下来,我们开始实现汉诺塔的主函数,递归的思想:
#include#include using namespace std;int num;stack a, b, c; //三个塔void move(int n, stack &s, stack & t, stack & l) { //我们将目前所在塔,需要借助的塔,和目标塔分别定义成s, t, l if (n == 1) { //当我们找到顶层的塔,进行移动 l.push(s.top()); s.pop(); } else { move(n - 1, s, l, t); //将前n-1层塔从s通过l移动到t塔上,方便我们将最底层塔移动到l上 l.push(s.top()); //将第n层塔移动到l塔上 s.pop(); move(n - 1, t, s, l);//再将t上的塔结束s移动到l上,完成汉诺塔的移动 }}int main() { cin >> num; // 输入汉诺塔层数 for (int i = num; i > 0; i--) // 将A塔填充完毕 a.push(i); move(num, a, b, c); return 0;}
如此我们就将整个汉诺塔的数据操作完成了,接下来我们需要将他可视化:
我们通过display来显示:#include#include using namespace std;int num;stack a, b, c; //三个塔void display() { auto temp1 = a; auto temp2 = b; auto temp3 = c; for (int i = num-1; i >= 0; i--) { if (i < a.size()) { cout << temp1.top() << ' '; temp1.pop(); } else cout << " "; if (i < b.size()) { cout << temp2.top() << ' '; temp2.pop(); } else cout << " "; if (i < c.size()) { cout << temp3.top() << endl; temp3.pop(); } else cout << endl; } cout << endl;}void move(int n, stack &s, stack & t, stack & l) { //我们将目前所在塔,需要借助的塔,和目标塔分别定义成s, t, l if (n == 1) { //当我们找到顶层的塔,进行移动 l.push(s.top()); s.pop(); display(); } else { move(n - 1, s, l, t); //将前n-1层塔从s通过l移动到t塔上,方便我们将最底层塔移动到l上 l.push(s.top()); //将第n层塔移动到l塔上 s.pop(); display(); move(n - 1, t, s, l);//再将t上的塔结束s移动到l上,完成汉诺塔的移动 }}int main() { cin >> num; // 输入汉诺塔层数 for (int i = num; i > 0; i--) // 将A塔填充完毕 a.push(i); display(); move(num, a, b, c); return 0;}
我们之前之所以将数据定义在main函数外面,也是为了display的
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2025年04月12日 06时00分15秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Python 元组Tuple 相对于数组List的优势
2019-03-05
Android基本知识
2019-03-05
在Java中,return null 是否安全, 为什么?
2019-03-05
命令模式【Command Pattern】
2019-03-05
如何将自己写的代码编进系统
2019-03-05
数据结构有哪些
2019-03-05
OSI 7 层网络模型
2019-03-05
Spring Bean 生命周期
2019-03-05
JDK 内置线程池
2019-03-05
JVM 参数默认值查询
2019-03-05
异常的继承结构
2019-03-05
SVN 和 Git 区别
2019-03-05
JDK 内置的多线程协作工具类的使用场景
2019-03-05
Java 源代码到运行的过程
2019-03-05
Java 中哪些对象可以获取类对象
2019-03-05
linux 的 cp 命令如何复制不提示覆盖
2019-03-05
缓存穿透 / 缓存击穿 / 缓存雪崩 / 缓存一致性
2019-03-05
linux 的 pwd 命令
2019-03-05
linux 的 sleep 命令
2019-03-05
js 的 let var const 区别
2019-03-05