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 汉诺塔的更多相关文章

  1. 理解 Hanoi 汉诺塔非递归算法

    汉诺塔介绍: 汉诺塔(港台:河内塔)是根据一个传说形成的数学问题: 最早发明这个问题的人是法国数学家爱德华·卢卡斯. 传说越南河内某间寺院有三根银棒,上串 64 个金盘.寺院里的僧侣依照一个古老的预言 ...

  2. 使用函数的递归调用来解决Hanoi(汉诺)塔问题。

    #include<stdio.h> void hanoi(int n, char x, char y, char z); void move(char x, char y); int ti ...

  3. Hanoi汉诺塔问题——递归与函数自调用算法

    题目描述 Description 有N个圆盘,依半径大小(半径都不同),自下而上套在A柱上,每次只允许移动最上面一个盘子到另外的柱子上去(除A柱外,还有B柱和C柱,开始时这两个柱子上无盘子),但绝不允 ...

  4. 《hanoi(汉诺塔)问题》求解

    //Hanoi(汉诺)塔问题.这是一个古典的数学问题,用递归方法求解.问题如下: /* 古代有一个梵塔,塔内有3个座A,B,C,开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上. 有一个老和 ...

  5. HT for Web 3D游戏设计设计--汉诺塔(Towers of Hanoi)

    在这里我们将构造一个基于HT for Web的HTML5+JavaScript来实现汉诺塔游戏. 汉诺塔的游戏规则及递归算法分析请参考http://en.wikipedia.org/wiki/Towe ...

  6. 汉诺塔-Hanoi

    1. 问题来源: 汉诺塔(河内塔)问题是印度的一个古老的传说. 法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵 ...

  7. 汉诺塔 Hanoi Tower

    电影<猩球崛起>刚开始的时候,年轻的Caesar在玩一种很有意思的游戏,就是汉诺塔...... 汉诺塔源自一个古老的印度传说:在世界的中心贝拿勒斯的圣庙里,一块黄铜板上插着三支宝石针.印度 ...

  8. [js - 算法可视化] 汉诺塔(Hanoi)演示程序

    前段时间偶然看到有个日本人很早之前写了js的多种排序程序,使用js+html实现的排序动画,效果非常好. 受此启发,我决定写几个js的算法动画,第一个就用汉诺塔. 演示地址:http://tut.ap ...

  9. 用递归方法解决汉诺塔问题(Recursion Hanoi Tower Python)

    汉诺塔问题源于印度的一个古老传说:梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.梵天命令婆罗门把圆盘按大小顺序重新摆放在另一根柱子上,并且规定小圆盘上不能放 ...

随机推荐

  1. 很好的UI动效设计参考

    toolBar下拉:

  2. Win7下:编译器错误信息: CS0016: 未能写入输出文件

    错误如下: "/"应用程序中的服务器错误. 编译错误 说明: 在编译向该请求提供服务所需资源的过程中出现错误.请检查下列特定错误详细信息并适当地修改源代码. 编译器错误消息: CS ...

  3. CentOS6.5安装mysql5.1.73

    思路: 1.查看有无安装过mysql rpm -qa|grep mysql

  4. (转)Block的使用

    转:http://my.oschina.net/leejan97/blog/268536 本文翻译自苹果的文档,有删减,也有添加自己的理解部分. 如果有Block语法不懂的,可以参考fuckingbl ...

  5. Wing IDE 5 的破解

    Wing IDE 百度百科 1.安装好Python,已测的是Python 2.7.10: 2.新建一个py文件CalcActivationCode.py(名字自己随便取): 3.CalcActivat ...

  6. CIO的职责、条件及价值

    从ERP项目的成功率中,我们可以知道企业的信息化道路是漫长的:从企业对ERP的投资热情中,我们可以知道企业信息化已经是企业的生死之战.对于信息化的成功,许多专家.学者都在强调“一把手”工程,ISO要“ ...

  7. index merge的一次优化

    手机微博4040端口SQL优化 现象 某端口常态化延迟,通过使用pt-query-digest发现主要由于一条count(*)语句引发,具体如下: # .5s .58M rss, .84M vsz # ...

  8. cocos2d-x基础元素之显示对象

    bool HelloWorld::init() { if ( !Layer::init() ) { return false; } Size visibleSize = Director::getIn ...

  9. hibernate一对多映射实现

    Junit4方法详解 setUpBeforeClass()类初始化前调用 tearDownAfterClass()类初始化后调用 setUp()在测试方法前调用 tearDown()在测试方法后调用 ...

  10. 02_嵌套矩形(DAG最长路问题)

    来源:刘汝佳<算法竞赛入门经典--训练指南> P60 问题2: 问题描述:有n个矩形,每个矩形可以用两个整数a,b描述,表示它们的长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中的条件 ...