3.4-汉诺塔的栈模拟
来源:互联网 发布:复旦大学有网络教育 编辑:程序博客网 时间:2024/06/06 05:52
In the classic problem of the Towers of Hanoi, you have 3 rods 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 (e.g., each disk sits on top of an even larger one). You have the following constraints:
(A) Only one disk can be moved at a time.
(B) A disk is slid off the top of one rod onto the next rod.
(C) A disk can only be placed on top of a larger disk.
Write a program to move the disks from the first rod to the last using Stacks.
其实用递归的方法比较简单,可以参考http://blog.csdn.net/wenqian1991/article/details/21461015
如果用栈来模拟递归的过程
首先我们考虑解题的算法:将N个碟子从第一根柱子移到最后一根柱子。我们先从最简单的情况开始。如果只有一个碟子,那么直接将它移到最后的柱子。那两个碟子呢?
(1)先将第一个碟子从第一根柱子移到第二根
(2)将第二个碟子从第一根柱子上移动到第三根
(3)再将第二根柱子上的碟子移动到第三根上,完成!
那三个碟子呢?
(1)采用两个碟子移动的方法,讲上两个碟子移动到第二根柱子上
(2)将第三个碟子移动到第三根柱子
(3)在采用运来的方法将第二根柱子上的两个碟子移动到第三根柱子。
就是先将n-1先移到b,然后a的top移到c,然后把b全部移到c,over!
#include <iostream>#include <stack>using namespace std;class Tower{public: stack<int>* disks; int num; Tower(int i):num(i) { disks = new stack<int>(); } int index() { return num; } void add(int d) { if (!disks->empty() && disks->top() <= d) return; 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* dst,Tower* buffer) { if (n>0) { moveDisks(n-1,buffer,dst); movetopto(dst); buffer->moveDisks(n-1,dst,this); } }};int main(){ Tower *towers[3]; for (int i = 0; i < 3; i++) towers[i] = new Tower(i); for (int i = 2; i >= 0; i--) towers[0]->add(i); towers[0]->moveDisks(3, towers[2], towers[1]); cout << "Hello world!" << endl; return 0;}
- 3.4-汉诺塔的栈模拟
- 递归的栈模拟
- 【数据结构】 栈的模拟
- 栈的模拟
- 栈的模拟实现
- 栈的模拟实现
- 用html5模拟的汉诺塔
- LinkList模拟栈的操作以及模拟队列的操作
- 栈的模拟与评析
- 全局变量模拟栈的操作
- Java栈的模拟实现
- 栈的使用和模拟
- POJ-----1363栈的模拟
- 栈模拟式子的计算
- js模拟栈的操作
- 用栈模拟汉诺塔问题
- 用栈模拟汉诺塔问题
- 用栈模拟汉诺塔问题
- 一个程序员的告白:多年后,我才学会承认自己的无知
- 抽象类和关键字final
- MySQL启动错误:Error writing file '/var/run/mysqld/mysqld.pid' (Errcode: 28)
- Linux下./configure错误详解
- cas 单点登陆
- 3.4-汉诺塔的栈模拟
- easyUI中PropertyGrid 设置不可编辑
- Java 多线程IO简单实用Demo
- Picture hdu 1828 扫描线
- 开发中遇到的一些小知识积累
- object-c笔记
- 花旗银行与友邦保险银保合作谋求共赢
- 向量空间模型(VSM)
- clsitctrl