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;}






0 0