经典汉诺塔问题

#include <iostream>
#include <stack>
#include <vector>
#include <cassert>

using namespace std;

class Tower {
public:
	stack<int> tower;
	int index;
	Tower(int index_in):index(index_in){}
	
	void addElement(int e)
	{
		if(!tower.empty())
			assert(tower.top() >= e);
		tower.push(e);
	}

	void moveTopTo(Tower& t)
	{
		int top = tower.top();
		tower.pop();
		t.addElement(top);
		cout << top << " from Tower " << index << " to Tower " << t.index << endl;
	}

	void moveDisks(int n, Tower& des, Tower& buffer)
	{
		if(n > 0)
		{
			moveDisks(n-1, buffer, des);
			moveTopTo(des);
			buffer.moveDisks(n-1, des, *this);
		}
	}
};

int main(int argc, const char* argv[])
{
	Tower tower1(1);
	Tower tower2(2);
	Tower tower3(3);
	vector<Tower> towers;
	towers.push_back(tower1);
	towers.push_back(tower2);
	towers.push_back(tower3);
	int n = 4;
	for(int i = n; i > 0; i--)
	{
		towers[0].addElement(i);
	}
	towers[0].moveDisks(n, towers[2], towers[1]);
	return 0;
}

你可能感兴趣的:(Algorithm,汉诺塔)