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,/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCADHAh0DAREAAhEBAxEB/8QAHQABAQEAAgMBAQAAAAAAAAAAAAcGAQIDBAUICf/EAFAQAQAABAIFBAsNBAcJAQAAAAABAgMGBAUHEReU0xIhNlcIFTEyQXN2tMLR0hMUGCJRVFZhdHWRk7I3VXGhIzM1Q2JygRYmNDhCR1Kxs1P/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8A/qmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADrPHVJNH6gYzRnnWLzmGe++6savuGPjSp6/BLyZY6v5g2oAAAAAAAAAAAAAAAAAAAAMTZ+c4vH3jcuEr1Yz0MNV1UpY/wDTDlRBtgAAAAAAAAAAAAAAAAAAAATvQfceYXNbmdYjMa/u9WhnuPwtOb5KclaMskP9IAogAAAAAAAAAAAAAAAAAAAAAOtTvJv4RBPdD/e3L95TfolBRAAAAAAAAAAAAAAAAAAAAATyw+n13+O9KIKGAAAAAAAAAAAAAAAAAAAACUdjj0TuHylzPziYFXAAAAAAAAAAAAAAAAAAAAAB1qd5N/CIJ7of725fvKb9EoKIAAAAAAAAAAAAAAAAAAAACeWH0+u/x3pRBQwAAAAAAAAAAAAAAAAAAAASjsceidw+UuZ+cTAq4AAAAAAAAAAAAAAAAAAAAAOtTvJv4RBPdD/e3L95TfolBRAAAAAAAAAAAAAAAAAAAAATyw+n13+O9KIKGAAAAAAAAAAAAAAAAAAAACUdjj0TuHylzPziYFXAAAAAAAAAAAAAAAAAAAAAB1qd5N/CIJ7of725fvKb9EoKIAAAAAAAAAAAAAAAAAAAACeWH0+u/wAd6UQUMAAAAAAAAAAAAAAAAAAAAEo7HHoncPlLmfnEwKuAAAAAAAAAAAAAAAAAAADOaQb1w+j61cVnmJw9TFUqE1OT3GlHVNNNPPLJLCGv65oAzkdJ1wQjGEbCzLX9ro+sHWbSdcEZYw/2CzLnh86o+sGU0f3XdNuy5z75sHMYe+sbGtTh77o97yYQ+X6gazafn/0CzLeqPrB58j0p4jMLnwmSZjbeMyaviqU1WlUr1pJ5ZoQjCEYfF/iCgAAAAAAAAAAAAAAAAAAAnlh9Prv8d6UQUMAAAAAAAAAAAAAAAAAAAAEo7HHoncPlLmfnEwKuAAAAAAAAAAAAAAAAAAACadkV+yrH/a8H5zTBSwAAATq6/wBrdrfZqv65QUUAAAAAAAAAAAAAAAAAAE8sPp9d/jvSiChgAAAAAAAAAAAAAAAAAAAAlHY49E7h8pcz84mBVwAAAAAAAAAAAAAAAAAAATTsiv2VY/7Xg/OaYKWAAACdXX+1u1vs1X9coKKAAAAAAAAAAAAAAAAAACeWH0+u/wAd6UQUMAAAAAAAAAAAAAAAAAAAAEo7HHoncPlLmfnEwKuAAAAAAAAAAAAAAAAAACOZNcGky9/fmPyPHW3gctkxFShTpY7C1p6vxJoyxjGMs2rnjAHzdIej7TFfVrV8njcFoUIVatGpy44HEc3IqSz/APn/AIQaSOW6YtfNnVoavsWI9sDtbpj/AH1aG5Yj2wO1umP99WhuWI9sDtbpj/fVobliPbB8DNLD0wZjdWWZzHPrQlmwdKanCT3jiOfXGEdff/UD7/a3TH++rQ3HEe2D7GiG781vDIMynzqXDQzLLszxGW1Z8HLGWlUjSjCHKlhGMYwhHX4QbkAAAAAAAAAAAAAAAAE8sPp9d/jvSiChgAAAAAAAAAAAAAAAAAAAAlHY49E7h8pcz84mBVwAAAAAAAAAAAAAAAAAATfQR0Txn3hiv/tOCkAAAAAAAl+gX+zrz8qsx/XKCoAAAAAAAAAAAAAAAAAnlh9Prv8AHelEFDAAAAAAAAAAAAAAAAAAAABKOxx6J3D5S5n5xMCrgAAAAAAAAAAAAAAAAAAm+gnonjPvDFf/AGnBSAAAAAAAS/QL/Z15+VWY/rlBUAAAAAAAAAAAAAAAAATyw+n13+O9KIKGAAAAAAAAAAAAAAAAAAAACUdjj0TuHylzPziYFXAAAAAAAAAAAAAAAABKNNFPNszuew8my24syt2jj8dXkxNbLJ5ZZ6kstCaaEsYzSx5tcNYO+xTN+s+8N4o8MHoZN2POLyDCzYbA6SbuoUZp5qkZZcRR76aMYxj/AFfyxiD39imb9Z94bxR4YGxTN+s+8N4o8MDYpm/WfeG8UeGBsUzfrPvDeKPDA2KZv1n3hvFHhgbFM36z7w3ijwwNimb9Z94bxR4YPnZJ2OmIt6njJMBpHu7Dy4vFVMZWhLiKPxqs8dc039X4dQPUuixs9sWbKczpaQ7nzCEMbTknwuMr0o0qssYR1yzQhJCOrm+UFsoTRnoU5o88YywjH8AeQAAAAAAAAAAAAAAE8sPp9d/jvSiChgAAAAAAAAAAAAAAAAAAAAlHY49E7h8pcz84mBVwAAAAAAAAAAAAAAAATPSV+0rRn94YnzacFMAAAAAAAAABgdMX9h5b9vp/+pgbnDf8NS/yQ/8AQPKAAAAAAAAAAAAAACeWH0+u/wAd6UQUMAAAAAAAAAAAAAAAAAAAAEo7HHoncPlLmfnEwKuAAAAAAAAAAAAAADiaaEksYzRhCEOeMY+AGAxWn3R9gcTVw9e6cFTrUpoyTyRhPzRhHVGHegmukTT1o/xOkTRzWpXRg56dHH4iapNCE/xYRw88IRj8X5QUX4Q+jj6WYL8J/ZA+EPo4+lmC/Cf2QPhD6OPpZgvwn9kD4Q+jj6WYL8J/ZA+EPo4+lmC/Cf2QPhD6OPpZgvwn9kD4Q+jj6WYL8J/ZA+EPo4+lmC/Cf2QPhD6OPpZgvwn9kD4Q+jj6WYL8J/ZBidK+nrR/jsmy+WhdGDqRlx1OaOqE/NDVN/hBsqHZDaOZaFOEbrwUIwlh4J/k/wAoNNaWkS27798doM3w+aRw+r3WFHXrk19zXrhD5AaMAAAAAAAAAAAAAE8sPp9d/jvSiChgAAAAAAAAAAAAAAAAAAAAlHY49E7h8pcz84mBVwAAAAAAAAAAAAAAZfSlNGTRvc0ZYxhGGXV4wjDwfEiDmxMvwtSzclmnw1GaaOEpRjGNOEYx+JAH3Y5VgoxhGODw8Yw7kY0peb+QOe1mD+aUPy4eoDtZg/mlD8uHqA7WYP5pQ/Lh6gO1mD+aUPy4eoDtZg/mlD8uHqA7WYP5pQ/Lh6gO1mD+aUPy4eoDtZg/mlD8uHqA7WYP5pQ/Lh6gO1mD+aUPy4eoHEcrwU3dwlCP8aUvqBz2swfzSh+XD1AlloUpKHZJX5JTklpydpctjyZYaod9W8AK4AAAAAAAAAAAAACeWH0+u/x3pRBQwAAAAAAAAAAAAAAAAAAAASjsceidw+UuZ+cTAq4AAAAAAAAAAAAAAMtpT/Ztc/3dX/REHtWD0LyT7HS/RAH3wAAAAAAAAAAAASW1f+ZW/PuTLP1VgVoAAAAAAAAAAAAAE8sPp9d/jvSiChgAAAAAAAAAAAAAAAAAAAAlHY49E7h8pcz84mBVwAAAAAAAAAAAAAZS9r3xdoe9/e1r5zcXusYwj2qpST+5/wCblTQBO730q55n9nZ1luH0Y3fCvi8HVo0+VhqWrlTSxhD+8B7FsaW85yi3ctwVXRheEatDD06c2rDUu7CWEI/3gPp7bM26sLx3alxANtmbdWF47tS4gG2zNurC8d2pcQDbZm3VheO7UuIBtszbqwvHdqXEA22Zt1YXju1LiAbbM26sLx3alxANtmbdWF47tS4gG2zNurC8d2pcQDbZm3VheO7UuIBtszbqwvHdqXEA22Zt1YXju1LiAbbM26sLx3alxAYTI75uTL9Md0XLU0ZXb2vzHLcFhaMIYalyuXTjUjNr/pP8UAbuOm3Nof8AbC8d2pcQFNwWJmxeEpVpqNTDzTywmjSqw1TSfVH6wecAAHrZnjJsvy/E4mTDVcZPRpzVIYehCEalSMIa+TLCPhj3IAmcNNubRhCOy+8YfVHDUuIDnbZm3VheO7UuIBtszbqwvHdqXEA22Zt1YXju1LiAbbM26sLx3alxANtmbdWF47tS4gG2zNurC8d2pcQDbZm3VheO7UuIDJ2xpHz/ACi6M+x9XRjd8aONqcqnqw1LX3Yx/wD0+sGs22Zt1YXju1LiAbbM26sLx3alxANtmbdWF47tS4gG2zNurC8d2pcQDbZm3VheO7UuIBtszbqwvHdqXEA22Zt1YXju1LiAbbM26sLx3alxAa2yryxV3Uq8+JtrN7djTjqhLmtOSSM/8OTNEGnAAABgbo0n5hbmcVcDQsW5M5pyatWLy+hTmpTc3gjGeEf5A+TtszbqwvHdqXEA22Zt1YXju1LiAbbM26sLx3alxANtmbdWF47tS4gG2zNurC8d2pcQDbZm3VheO7UuIBDTZm2v9mF47tS4gMNohvu47KyHNsJj9GN2xq4nOcbjZPc8NSj/AEdWrGaX+87uqINztszbqwvHdqXEA22Zt1YXju1LiAbbM26sLx3alxANtmbdWF47tS4gG2zNurC8d2pcQDbZm3VheO7UuIBtszbqwvHdqXEA22Zt1YXju1LiA9vKdL2Z5nmeGwlTR3dWBkrVJZI4nE4elCnThGOrlTRhUjHVAFJAAAAAAAAAAAAAAABx3AdaNaniKcKlKpLUkj3JpI64R/1B3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABj9Ld4zWJo/wA4zejRqYrGUqMfe2Eoy8qriKngkklhzzTR5+aHyAw+gG468MVmdv1amJq4WlLDFYSbGYeNCenJNq10tUe+1RjNHlf6auYFoAAAAAAAAAAAAAAAAAAABxNLy5Yy64w1w1a4d0H5Fo1M8yXPbsx+T5lcuNzLB3dUp8rGYurWwFLBQqU/dZeTH4sNUnL1Q8EQfrXCYqnjsLRxFGaE9GrJCpJNDwyxhrhEHmAAAAAAAAAAAAAAAAAAABgNJWNxWLzPJ7do4qrgqGZ8uFevh54yVZZYRhCMJZoc8sfjd0HkszRvirNz+rXkuLMcyyyNCNOnhMwrzVppYxjCPKjPGPPHmj4PCDdgAAAAAAAAAAAAAAAAAAAAy176PsBfc+UTY6rWpzZZjJMdh/cp4y6qssIwhGOqPPD40eaPMDrW0d4CremDuWFWrTxmGoe94U5I6pJ5dcY88NeruxBqwAAAAAAAAAAAAAAAAAAAcTQjNLGEI8mMYc0fkBH8r0EZxlmMz7/f/Ma2W5zmVbMcRgJsDQhL/SauVThNq16tUNWvu84Kzl+BpZZgMNg6EOTRw9OWlJD5JZYaofygD2AAAAAAAAAAAAAAAAAAAAZ+77Qp3VhafIxVTL8fQjysNjaUsJp6M3ywhHmj4OaIPBZ9m17c90r5hnOJz3MqsNU+LxEsKeuHyciX4sPB3IA04AAAAAAP/9k=" 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. Java 之 内部类

    (static修饰的成员属于整个类,而不属于单个对象) 定义:将一个类放到另一个类的内部定义,这个在内部定义的类就叫做内部类(也有的成嵌套类),包含内部类的类被称为外部类(也有的称宿主类). 1.非静 ...

  2. 数据库测试DbUnit

    DBUnit 的设计理念就是在测试之前,备份数据库,然后给对象数据库植入我们需要的准备数据,最后,在测试完毕后,读入备份数据库,回溯到测试前的状态: 摘自:DbUnit入门实战 DBUnit官网:ht ...

  3. Atitit。 《吠陀》 《梨俱吠陀》overview 经读后感  是印度上古时期一些文献的总称

    Atitit. <吠陀> <梨俱吠陀>overview 经读后感  是印度上古时期一些文献的总称 1. 印度古<吠陀>经,是印度上古时期一些文献的总称, 1 1.1 ...

  4. 谈谈JavaScript的2种主要继承方式

    今天给自己巩固一下js的继承知识,基础不好,有不对的地方,请尽量拍砖,越重越好. js继承方法最主要的是2种,一种是通过原型的方式,一种是通过借用call&apply的构造函数方式. 1.原型 ...

  5. ASP.NET操作Cookie

    1.生成Cookie public static void SetDataByCookie(string mainKey, string subKey, string value, string do ...

  6. nginx 配置wordpress固定链接(自定义)

    今天在wordpress 下配置文章固定链接的时候,遇到了404的错误.我首先在wordpress下的设置里的“固定链接”配置页面,自定义链接的结构 “http://www.haozi8.com/%p ...

  7. Python pass语句作用与用法

    Python中的pass语句作用是什么?表示它不做任何事情,一般用做占位语句.pass语句具体作用及使用方法,我们往下看. pass语句在函数中的作用 当你在编写一个程序时,执行语句部分思路还没有完成 ...

  8. Sharepoint-Hosted App in 2013资料

    一个完整的流程,可参考网址 My First Sharepoint-Hosted App in 2013 部署第一个APP会遇到各种问题,可以参考网址 App development in Share ...

  9. Linux NFS 介绍

    由SUN开发,用于在不同的系统之间使用,所以其设计与主机系统无关,用户想使用远程文件时,只需要mount –t nfs就可以把远程的文件拿到本地,像使用本地文件一样使用,非常方便. 它采用C/S架构, ...

  10. 教你一招 - Misc类型插件的妙用(附带插件源码)

    熟悉nopcommerce插件的朋友应该知道里面有一种Misc类型的插件,比如Nop.Plugin.Misc.WebServices和 Nop.Plugin.Misc.FacebookShop,继承自 ...