#include<iostream>
#include <cstdlib>
#include "Pila.hpp"

int posbit(int n)
{
	int p= 0;
	while (n>0) {
		if ((n&1) != 0) 
			return p;
		n>>=1;
		++p;
	}
	return p;
}

int main(int argc, char *argv[])
{
	int n;
	if (argc<2) {
		std::cerr << "uso: " << argv[0] << " n\n";
		return EXIT_FAILURE;
	}
	n= atoi(argv[1]);
	
	Pila p[3];
	for (int k=0; k<3; ++k)
		p[k].tamano(n);
		
	int esta[n];
	for (int k=n-1; k>=0; --k) {
		p[0].mete(k);	
		esta[k]= 0;
	}
	
	for (int k=0; k<3; ++k)
		std::cout << p[k] << std::endl;
	std::cout << "---\n";

	int m= 1 << n;
	for (int k=1; k<m; ++k) {
		int d= posbit(k);
		std::cout << "mover disco " << d ;
		int pos= esta[d];
		int der= (pos+1)%3;
		if (!p[der].vacia() && p[der].tope()<d)
			der= (der+1)%3;
		std::cout << " de la torre " << pos 
				<< " a la torre " << der << std::endl;
		p[pos].saca();
		p[der].mete(d);
		esta[d]= der;
		for (int k=0; k<3; ++k)
			std::cout << p[k] << std::endl;
		std::cout << "---\n";
	}
		
	return EXIT_SUCCESS;
}
