[CareerCup] 3.4 Towers of Hanoi 汉诺塔
3.4 In the classic problem of the Towers of Hanoi, you have 3 towers and N disks of different sizes which can slide onto any tower. The puzzle starts with disks sorted in ascending order of size from top to bottom (i.e., each disk sits on top of an even larger one). You have the following constraints:
(1) Only one disk can be moved at a time.
(2) A disk is slid off the top of one tower onto the next tower.
(3) A disk can only be placed on top of a larger disk.
Write a program to move the disks from the first tower to the last using stacks.
经典的汉诺塔问题,记得当年文曲星流行的日子,什么汉诺塔啊,英雄坛说啊,华容道啊,都是文曲星上的经典游戏,当时还觉得汉诺塔蛮难玩的,大学里学数据结构的时候才发现原来用递归这么容易解决。那么我们来看看用递归如何实现:
aaarticlea/jpeg;base64,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" alt="" width="352" height="129" />
假如n = 1,直接将Disk 1移到Tower C即可
假如n = 2,需要三步:
1. 把Disk 1 从Tower A 移到 Tower B
2. 把Disk 2 从Tower A 移到 Tower C
3. 把Disk 1 从Tower B 移到 Tower C
假如n = 3,需要如下几步:
1. 我们首先把上面两层移到另一个位置,我们在n = 2时实现了,我们将其移到 Tower B
2. 把Disk 3 移到Tower C
3. 然后把上面两层移到Disk 3,方法跟n = 2时相同
假如n = 4,需要如下几步:
1. 把Disk 1, 2, 3 移到 Tower B,方法跟n = 3时相同
2. 把Disk 4 移到 Tower C
3. 把Disk 1, 2, 3 移到 Tower C
这时典型的递归方法,实现方法参见下面代码:
class Tower {
public:
Tower(int i) : _idx(i) {} int index() { return _idx; } void add(int d) {
if (!_disks.empty() && _disks.top() <= d) {
cout << "Error placing disk " << d << endl;
} else {
_disks.push(d);
}
} void moveTopTo(Tower &t) {
int top = _disks.top(); _disks.pop();
t.add(top);
cout << "Move disk " << top << " from " << index() << " to " << t.index() << endl;
} void moveDisks(int n, Tower &destination, Tower &buffer) {
if (n > ) {
moveDisks(n - , buffer, destination);
moveTopTo(destination);
buffer.moveDisks(n - , destination, *this);
}
} private:
stack<int> _disks;
int _idx;
}; int main() {
int n = ;
vector<Tower> towers;
for (int i = ; i < ; ++i) {
Tower t(i);
towers.push_back(t);
}
for (int i = n - ; i >= ; --i) {
towers[].add(i);
}
towers[].moveDisks(n, towers[], towers[]);
return ;
}
[CareerCup] 3.4 Towers of Hanoi 汉诺塔的更多相关文章
- 理解 Hanoi 汉诺塔非递归算法
汉诺塔介绍: 汉诺塔(港台:河内塔)是根据一个传说形成的数学问题: 最早发明这个问题的人是法国数学家爱德华·卢卡斯. 传说越南河内某间寺院有三根银棒,上串 64 个金盘.寺院里的僧侣依照一个古老的预言 ...
- 使用函数的递归调用来解决Hanoi(汉诺)塔问题。
#include<stdio.h> void hanoi(int n, char x, char y, char z); void move(char x, char y); int ti ...
- Hanoi汉诺塔问题——递归与函数自调用算法
题目描述 Description 有N个圆盘,依半径大小(半径都不同),自下而上套在A柱上,每次只允许移动最上面一个盘子到另外的柱子上去(除A柱外,还有B柱和C柱,开始时这两个柱子上无盘子),但绝不允 ...
- 《hanoi(汉诺塔)问题》求解
//Hanoi(汉诺)塔问题.这是一个古典的数学问题,用递归方法求解.问题如下: /* 古代有一个梵塔,塔内有3个座A,B,C,开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上. 有一个老和 ...
- HT for Web 3D游戏设计设计--汉诺塔(Towers of Hanoi)
在这里我们将构造一个基于HT for Web的HTML5+JavaScript来实现汉诺塔游戏. 汉诺塔的游戏规则及递归算法分析请参考http://en.wikipedia.org/wiki/Towe ...
- 汉诺塔-Hanoi
1. 问题来源: 汉诺塔(河内塔)问题是印度的一个古老的传说. 法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵 ...
- 汉诺塔 Hanoi Tower
电影<猩球崛起>刚开始的时候,年轻的Caesar在玩一种很有意思的游戏,就是汉诺塔...... 汉诺塔源自一个古老的印度传说:在世界的中心贝拿勒斯的圣庙里,一块黄铜板上插着三支宝石针.印度 ...
- [js - 算法可视化] 汉诺塔(Hanoi)演示程序
前段时间偶然看到有个日本人很早之前写了js的多种排序程序,使用js+html实现的排序动画,效果非常好. 受此启发,我决定写几个js的算法动画,第一个就用汉诺塔. 演示地址:http://tut.ap ...
- 用递归方法解决汉诺塔问题(Recursion Hanoi Tower Python)
汉诺塔问题源于印度的一个古老传说:梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.梵天命令婆罗门把圆盘按大小顺序重新摆放在另一根柱子上,并且规定小圆盘上不能放 ...
随机推荐
- Cocos2d-x 基础元素
看过本章,然后实践之后,应该会掌握以下的认识: 1.Cocos2d-x引擎的基本运转过程 2.Cocos2d-x引擎的一些初始设置 3.对导演及图层及现实对象的认识 4.如何定义自己的显示对象 *:f ...
- Informatica Powercenter学习笔记
LOOKUP TRANSFORMATION的使用点评: LOOKUP基本用法不熟的话请参考下附属信息. 用法感受: 1 LOOKUP的作用跟我们以前在EXCEL的函数功能类似,就是隔表取值.优点就是用 ...
- C#程序调用cmd执行命令
对于C#通过程序来调用cmd命令的操作,网上有很多类似的文章,但很多都不行,竟是漫天的拷贝.我自己测试整理了一下. 代码: string str = Console.ReadLine(); Syste ...
- 斐波那契数列 递归 尾递归 递推 C++实现
==================================声明================================== 本文原创,转载请注明作者和出处,并保证文章的完整性(包括本 ...
- redis AOF保存机制
网上说AOF有三种保存方式,不自动保存.每秒自动保存.每命令自动保存. 其中每秒自动保存这个看起来很美好,但是可能会被各种IO的时间所延迟,所以究竟是怎么判断每秒保存的,并不是太明白,故有此文. AO ...
- NOIP2008普及组 题解 -SilverN
T1 ISBN号码 题目描述 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字.1位识别码和3位分隔符, 其规定格式如“x-xxx-xxxxx-x”,其中符号“-”就是分隔符( ...
- 对于大学4年的反思(续),记我的ThoughtWorks面试
之前我写了一篇对于大学四年的反思,时隔一个月,为什么我这么快就要来写这篇续章呢?主要有两个原因,第一是感谢静子姐姐,记得知乎上有个回答里面说过人生需要有贵人的帮助,遇到贵人是一件很幸运的事情.我想,静 ...
- python中的自测语句是什么?
if __name__ == '__main__': main() 以上
- UESTC 900 方老师炸弹 --Tarjan求割点及删点后连通分量数
Tarjan算法. 1.若u为根,且度大于1,则为割点 2.若u不为根,如果low[v]>=dfn[u],则u为割点(出现重边时可能导致等号,要判重边) 3.若low[v]>dfn[u], ...
- Codeforces Round #266 (Div.2) B Wonder Room --枚举
题意:给出一个两边长为a,b的矩形,要求增加a和增加b使a*b>=6*n且a*b最小. 解法:设新的a,b为a1,b1,且设a<b,那么a<=a1<=ceil(sqrt(6*n ...