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. win7共享文件夹给局域网

    1.设置共享   2.关闭"需要密码访问"          

  2. SAM4E单片机之旅——17、通过UART进行标准IO

    交互还是很有必要的,而且使用键盘和显示器的交互效率还是很高的.当然,可以直接使用UART进行字符的输入和输出.但是又何必浪费了C的标准输入输出的格式控制之类的功能呢? 这次内容就是使用scanf() ...

  3. forfiles命令批量删除N天前文件

    在整理手上几台SQL SERVER 2000的数据库备份时,一方面为了方便快速还原数据库,另外一方面为了备份冗余.备份方式统一(先备份到本地,然后收上磁带),将以前通过Symantec Backup ...

  4. 设置自己的RadASM颜色

    在RadASM.ini中的color节添加 4=wls_asm_color,16777215,0,8388608,16777215,15777984,12644544,12632304,1644176 ...

  5. Android 开发框架

    Android 开发框架包括基本的应用功能开发.数据存储.网络访问三大块. 1 应用方面 一般而言,一个标准的Android 程序包括Activity.Broadcast Intent Receive ...

  6. Load xlsx in a folder to RDBMS table with Talend

    Step 1 . Use tFileList component to get the file list. And set proper property. Step 2. Use tFileInp ...

  7. 边工作边刷题:70天一遍leetcode: day 75

    Group Shifted Strings 要点:开始就想到了string之间前后字符diff要相同. 思维混乱的地方:和某个string的diff之间是没有关系的.所以和单个string是否在那个点 ...

  8. [转载]ExtJs4 笔记(3) Ext.Ajax 对ajax的支持

    作者:李盼(Lipan)出处:[Lipan] (http://www.cnblogs.com/lipan/)     本篇主要介绍一下ExtJs常用的几个对JS语法的扩展支持,包括Ajax封装,函数事 ...

  9. UESTC 876 爱管闲事 --DP

    题意:即求给定n个数字(a1,a2,……an),不改变序列,分成M份,使每一份和的乘积最大. 思路:dp[i][j]表示把前i个数字,分成j份所能得到的最大乘积. 转移方程:dp[i][j] = ma ...

  10. HDU 5105 Math Problem --数学,求导

    官方题解: f(x)=|a∗x3+b∗x2+c∗x+d|, 求最大值.令g(x)=a∗x3+b∗x2+c∗x+d,f(x)的最大值即为g(x)的正最大值,或者是负最小值.a!=0时, g′(x)=3∗ ...