#include <iostream>
#include <cstdlib>
#include <stack>

using namespace std;

stack<int> A, B, C;

void Print(char n, stack<int>& P)
{
    stack<int> Q;
    while ( ! P.empty() )
      {
       int u= P.top();
       P.pop();
       Q.push(u);
      }
    cout << n << ": ";
    while ( ! Q.empty() )
      {
       int u= Q.top();
       Q.pop();
       P.push(u);
       cout << ' ' << u;
      }
    cout << endl;
}

int Hanoi(int n, char a, char b, char c)
{
   if (n>0)
      {
       Hanoi(n-1, a, c, b);
       cout << "mueva el disco " << n 
            << " desde la pila " << a
            << " hasta la pila " << b << endl;
       int u;
       switch (a) {
           case 'a':  u= A.top();
                      A.pop();
                      break;
           case 'b':  u= B.top();
                      B.pop();
                      break;
           case 'c':  u= C.top();
                      C.pop();
                      break;
          }
       switch (b) {
           case 'a':  A.push(u);
                      break;
           case 'b':  B.push(u);
                      break;
           case 'c':  C.push(u);
                      break;
          }
       Print('a', A);
       Print('b', B);
       Print('c', C);
       cout << "---\n";
       Hanoi(n-1, c, b, a);
      }
}

int main(int nargs, char* args[])
{
   if (nargs < 2)
      {
       cerr << "se usa:\n\n" << args[0] << " num_discos\n";
       return EXIT_FAILURE;
      }
   int n;
   n= atoi(args[1]);
   for (int k=n; k>0; k--)
      A.push(k);
   Print('a',A);
   Print('b',B);
   Print('c',C);
   cout << "---\n";
   Hanoi(n, 'a', 'b', 'c');
   return EXIT_SUCCESS;
}
