#include<iostream>
#include<stack>
using namespace std;
class Tower{
public:
Tower(){}
Tower(int i) :index(i){}
~Tower(){};
int getIndex(){ return index; }
void add(int d){
if (!disks.empty() && disks.top() <= d)
cout << "Error placing disk: " << d << endl;
else
disks.push(d);
}
static void moveTopTo(Tower& origal, Tower& destination){
int& top1 = origal.disks.top();
if (origal.disks.size()>0)
origal.disks.pop();
destination.add(top1);
cout << "Move " << top1 << " from " << origal.getIndex() << " to " << destination.getIndex() << endl;
}
static void moveDisks(int n, Tower& origin, Tower& destination, Tower& buffer){
if (n >0){
moveDisks(n - 1, origin, buffer, destination);
moveTopTo(origin, destination);
moveDisks(n - 1, buffer, destination, origin);
}
}
private:
stack<int> disks;
int index;
};
int main(){
int n = 5;
Tower towers[3];
for (int i = 0; i < 3; i++)
towers[i] = Tower(i);
for (int i = n - 1; i >= 0; --i)
towers[0].add(i);
Tower::moveDisks(n, towers[0], towers[2], towers[1]);
cin.get();
return 0;
}