public static int iterativo(int n, Pila ini, Pila fin, Pila aux)
        {
            int m = 0; //M es igual al numero de movimientos realizados

            //==============================================================================
            // Si n no es par
            //==============================================================================

            if (n % 2 != 0)
            {
                while (fin.Size != n)
                {
                    mover_disco(ini, fin);
                    m++;
                    if (fin.Size == n)
                    {
                        break;
                    }
                    mover_disco(ini, aux);
                    m++;
                    if (fin.Size == n)
                    {
                        break;
                    }
                    mover_disco(aux, fin);
                    m++;
                    if (fin.Size == n)
                    {
                        break;
                    }
                }
            }
            //==============================================================================
            // Si n es par
            //==============================================================================
            else
            {
                while (fin.Size != n)
                {
                    mover_disco(ini, aux);
                    m++;
                    if (fin.Size == n)
                    {
                        break;
                    }
                    mover_disco(ini, fin);
                    m++;
                    if (fin.Size == n)
                    {
                        break;
                    }
                    mover_disco(aux, fin);
                    m++;
                    if (fin.Size == n)
                    {
                        break;
                    }
                }
            }
            return(m);
        }
예제 #2
0
 public int iterativo(int n, Pila ini, Pila fin, Pila aux)
 {
     return(0);
 }
예제 #3
0
        static TestHanoi()
        {
            Hanoi hanoi = new Hanoi();

            /*---------------------------------------------*/

            /*  TESTING:
             *  de pila_A (plena) a Pila_B (buida)
             *  amb move_disco(pila_A, pila_B ) */
            /*---------------------------------------------*/
            Console.WriteLine(" =================================================================================================");
            Console.WriteLine("  de pila_A (plena) a Pila_B (buida) amb move_disco(pila_A, pila_B )");

            Pila pila_A = new Pila();
            Pila pila_B = new Pila();

            Disco disco_1 = new Disco();

            disco_1.ValorInt = 1;
            Disco disco_2 = new Disco();

            disco_2.ValorInt = 2;
            Disco disco_3 = new Disco();

            disco_3.ValorInt = 3;

            pila_A.push(disco_3);
            pila_A.push(disco_2);
            pila_A.push(disco_1);

            int loop = pila_A.Size;

            for (int i = 0; i < loop; i++)
            {
                Console.WriteLine("");
                Console.Write("Abans de menejar   ");
                Console.Write(" Top Pila_A: " + pila_A.Top.ToString());
                Console.WriteLine(" Top Pila_B: " + pila_B.Top.ToString());
                foreach (Disco element in pila_A.Elementos)
                {
                    Console.WriteLine(" En Pila A " + element.ValorInt.ToString());
                }
                Console.WriteLine("...........");
                foreach (Disco element in pila_B.Elementos)
                {
                    Console.WriteLine(" En Pila B " + element.ValorInt.ToString());
                }
                Console.WriteLine(" "); Console.WriteLine(" ");

                hanoi.mover_disco(ref pila_A, ref pila_B);
                Console.Write("Despres de menejar ");
                Console.Write(" Top Pila_A: " + pila_A.Top.ToString());
                Console.WriteLine(" Top Pila_B: " + pila_B.Top.ToString());
                foreach (Disco element in pila_A.Elementos)
                {
                    Console.WriteLine(" En Pila A " + element.ValorInt.ToString());
                }
                Console.WriteLine("...........");
                foreach (Disco element in pila_B.Elementos)
                {
                    Console.WriteLine(" En Pila B " + element.ValorInt.ToString());
                }
                Console.WriteLine(" "); Console.WriteLine(" ");

                Console.WriteLine("Següent iteració");
            }
            Console.WriteLine();
            Console.WriteLine("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
            Console.WriteLine("····························································");
            Console.WriteLine("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
            Console.WriteLine(" "); Console.WriteLine(" ");



            /*---------------------------------------------*/

            /*  TESTING:
             *  de pila_A (plena) a Pila_B (buida)
             *  amb move_disco(pila_B, pila_A ) */
            /*---------------------------------------------*/
            Console.WriteLine(" =================================================================================================");
            Console.WriteLine("  de pila_A (plena) a Pila_B (buida) amb move_disco(pila_B, pila_A )");


            for (int i = 0; i < loop; i++)
            {
                Console.WriteLine("");
                Console.Write("Abans de menejar   ");
                Console.Write(" Top Pila_A: " + pila_A.Top.ToString());
                Console.WriteLine(" Top Pila_B: " + pila_B.Top.ToString());
                foreach (Disco element in pila_A.Elementos)
                {
                    Console.WriteLine(" En Pila A " + element.ValorInt.ToString());
                }
                Console.WriteLine("...........");
                foreach (Disco element in pila_B.Elementos)
                {
                    Console.WriteLine(" En Pila B " + element.ValorInt.ToString());
                }
                hanoi.mover_disco(ref pila_B, ref pila_A);
                Console.Write("Despres de menejar ");
                Console.Write(" Top Pila_A: " + pila_A.Top.ToString());
                Console.WriteLine(" Top Pila_B: " + pila_B.Top.ToString());
                foreach (Disco element in pila_A.Elementos)
                {
                    Console.WriteLine(" En Pila A " + element.ValorInt.ToString());
                }
                Console.WriteLine("...........");
                foreach (Disco element in pila_B.Elementos)
                {
                    Console.WriteLine(" En Pila B " + element.ValorInt.ToString());
                }
                Console.WriteLine(" "); Console.WriteLine(" ");
                Console.WriteLine("Següent iteració");
            }
            Console.WriteLine();
            Console.WriteLine("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
            Console.WriteLine("····························································");
            Console.WriteLine("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
            Console.WriteLine(" "); Console.WriteLine(" ");



            /*---------------------------------------------*/

            /*  TESTING:
             *  iterativo(int n,  Pila ini, Pila fin, Pila aux) amb n = 3 */
            /*---------------------------------------------*/
            Console.WriteLine(" =================================================================================================");
            Console.WriteLine("  iterativo(int n,  Pila ini, Pila fin, Pila aux) amb n = 3");

            Pila pila_C = new Pila();
            int  passos;

            Console.WriteLine("Abans d'executarXXXXXXXXXXXXXXXXXXXXXXXX");

            Console.WriteLine("........................ ");
            Console.WriteLine("Elements en la pila ini");
            foreach (Disco Element in pila_A.Elementos)
            {
                Console.WriteLine(" " + Element.ValorInt.ToString());
            }
            Console.WriteLine("........................ ");
            Console.WriteLine("Elements en la pila aux");
            foreach (Disco Element in pila_B.Elementos)
            {
                Console.WriteLine(" " + Element.ValorInt.ToString());
            }
            Console.WriteLine("........................ ");
            Console.WriteLine("Elements en la pila fin");
            foreach (Disco Element in pila_C.Elementos)
            {
                Console.WriteLine(" " + Element.ValorInt.ToString());
            }
            Console.WriteLine(" "); Console.WriteLine(" ");

            passos = hanoi.iterativo(pila_A.Size, ref pila_A, ref pila_C, ref pila_B);
            Console.WriteLine("Despprés d'executar XXXXXXXXXXXXXXXXXXXXXXXX");

            Console.WriteLine("........................ ");
            Console.WriteLine("Elements en la pila ini");
            foreach (Disco Element in pila_A.Elementos)
            {
                Console.WriteLine(" " + Element.ValorInt.ToString());
            }
            Console.WriteLine("........................ ");
            Console.WriteLine("Elements en la pila aux");
            foreach (Disco Element in pila_B.Elementos)
            {
                Console.WriteLine(" " + Element.ValorInt.ToString());
            }
            Console.WriteLine("........................ ");
            Console.WriteLine("Elements en la pila fin");
            foreach (Disco Element in pila_C.Elementos)
            {
                Console.WriteLine(" " + Element.ValorInt.ToString());
            }
            Console.WriteLine(" "); Console.WriteLine(" ");

            Console.WriteLine(" El número de passos calculat per iteració son: " + passos.ToString());
            Console.WriteLine("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
            Console.WriteLine("····························································");
            Console.WriteLine("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
            Console.WriteLine(" "); Console.WriteLine(" ");



            /*---------------------------------------------*/

            /*  TESTING:
             *  iterativo(int n,  Pila ini, Pila fin, Pila aux) amb n = 4 */
            /*---------------------------------------------*/
            Console.WriteLine(" =================================================================================================");
            Console.WriteLine("  iterativo(int n,  Pila ini, Pila fin, Pila aux) amb n = 4");


            Pila pila_ini = new Pila();
            Pila pila_fin = new Pila();
            Pila pila_aux = new Pila();


            Disco disco_10 = new Disco();

            disco_10.ValorInt = 1;
            Disco disco_20 = new Disco();

            disco_20.ValorInt = 2;
            Disco disco_30 = new Disco();

            disco_30.ValorInt = 3;
            Disco disco_40 = new Disco();

            disco_40.ValorInt = 4;

            pila_ini.push(disco_40);
            pila_ini.push(disco_30);
            pila_ini.push(disco_20);
            pila_ini.push(disco_10);

            Console.WriteLine("Abans d'executarXXXXXXXXXXXXXXXXXXXXXXXX");
            Console.WriteLine("........................ ");
            Console.WriteLine("Elements en la pila ini");
            foreach (Disco Element in pila_ini.Elementos)
            {
                Console.WriteLine(" " + Element.ValorInt.ToString());
            }
            Console.WriteLine("........................ ");
            Console.WriteLine("Elements en la pila aux");
            foreach (Disco Element in pila_aux.Elementos)
            {
                Console.WriteLine(" " + Element.ValorInt.ToString());
            }
            Console.WriteLine("........................ ");
            Console.WriteLine("Elements en la pila fin");
            foreach (Disco Element in pila_fin.Elementos)
            {
                Console.WriteLine(" " + Element.ValorInt.ToString());
            }
            Console.WriteLine(" "); Console.WriteLine(" ");

            passos = hanoi.iterativo(pila_ini.Size, ref pila_ini, ref pila_fin, ref pila_aux);

            Console.WriteLine("Despprés d'executar XXXXXXXXXXXXXXXXXXXXXXXX");
            Console.WriteLine("........................ ");
            Console.WriteLine("Elements en la pila ini");
            foreach (Disco Element in pila_ini.Elementos)
            {
                Console.WriteLine(" " + Element.ValorInt.ToString());
            }
            Console.WriteLine("........................ ");
            Console.WriteLine("Elements en la pila aux");
            foreach (Disco Element in pila_aux.Elementos)
            {
                Console.WriteLine(" " + Element.ValorInt.ToString());
            }
            Console.WriteLine("........................ ");
            Console.WriteLine("Elements en la pila fin");
            foreach (Disco Element in pila_fin.Elementos)
            {
                Console.WriteLine(" " + Element.ValorInt.ToString());
            }
            Console.WriteLine(" "); Console.WriteLine(" ");

            Console.WriteLine(" El número de passos calculat per iteració son: " + passos.ToString());
            Console.WriteLine("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
            Console.WriteLine("····························································");
            Console.WriteLine("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
            Console.WriteLine(" "); Console.WriteLine(" ");



            /*---------------------------------------------*/

            /*  TESTING:
             * recursivo(int n,  Pila ini, Pila fin, Pila aux) amb n = 4 */
            /*---------------------------------------------*/
            Console.WriteLine(" =================================================================================================");
            Console.WriteLine("  recursivo(int n,  Pila ini, Pila fin, Pila aux) amb n = 4");


            Pila ini = new Pila();
            Pila fin = new Pila();
            Pila aux = new Pila();


            ini.push(disco_40);
            ini.push(disco_30);
            ini.push(disco_20);
            ini.push(disco_10);

            Console.WriteLine("Abans d'executarXXXXXXXXXXXXXXXXXXXXXXXX");
            Console.WriteLine("........................ ");
            Console.WriteLine("Elements en la pila ini");
            foreach (Disco Element in ini.Elementos)
            {
                Console.WriteLine(" " + Element.ValorInt.ToString());
            }
            Console.WriteLine("........................ ");
            Console.WriteLine("Elements en la pila aux");
            foreach (Disco Element in aux.Elementos)
            {
                Console.WriteLine(" " + Element.ValorInt.ToString());
            }
            Console.WriteLine("........................ ");
            Console.WriteLine("Elements en la pila fin");
            foreach (Disco Element in fin.Elementos)
            {
                Console.WriteLine(" " + Element.ValorInt.ToString());
            }
            Console.WriteLine(" "); Console.WriteLine(" ");

            passos = hanoi.recursivo(ini.Size, ref ini, ref fin, ref aux);

            Console.WriteLine("Despprés d'executar XXXXXXXXXXXXXXXXXXXXXXXX");
            Console.WriteLine("........................ ");
            Console.WriteLine("Elements en la pila ini");
            foreach (Disco Element in ini.Elementos)
            {
                Console.WriteLine(" " + Element.ValorInt.ToString());
            }
            Console.WriteLine("........................ ");
            Console.WriteLine("Elements en la pila aux");
            foreach (Disco Element in aux.Elementos)
            {
                Console.WriteLine(" " + Element.ValorInt.ToString());
            }
            Console.WriteLine("........................ ");
            Console.WriteLine("Elements en la pila fin");
            foreach (Disco Element in fin.Elementos)
            {
                Console.WriteLine(" " + Element.ValorInt.ToString());
            }
            Console.WriteLine(" "); Console.WriteLine(" ");

            Console.WriteLine(" El número de passos calculat per recursivitat son: " + passos.ToString());
            Console.WriteLine("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
            Console.WriteLine("····························································");
            Console.WriteLine("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
            Console.WriteLine(" "); Console.WriteLine(" ");



            /*---------------------------------------------*/

            /*  TESTING:
             * colaRecursiva(int n,  Pila ini, Pila fin, Pila aux) amb n = 4 */
            /*---------------------------------------------*/
            Console.WriteLine(" =================================================================================================");
            Console.WriteLine("  colaRecursivo(int n,  Pila ini, Pila fin, Pila aux) amb n = 4");


            Pila ini_1 = new Pila();
            Pila fin_1 = new Pila();
            Pila aux_1 = new Pila();


            ini_1.push(disco_40);
            ini_1.push(disco_30);
            ini_1.push(disco_20);
            ini_1.push(disco_10);

            Console.WriteLine("Abans d'executarXXXXXXXXXXXXXXXXXXXXXXXX");
            Console.WriteLine("........................ ");
            Console.WriteLine("Elements en la pila ini_1");
            foreach (Disco Element in ini_1.Elementos)
            {
                Console.WriteLine(" " + Element.ValorInt.ToString());
            }
            Console.WriteLine("........................ ");
            Console.WriteLine("Elements en la pila aux_1");
            foreach (Disco Element in aux_1.Elementos)
            {
                Console.WriteLine(" " + Element.ValorInt.ToString());
            }
            Console.WriteLine("........................ ");
            Console.WriteLine("Elements en la pila fin_1");
            foreach (Disco Element in fin_1.Elementos)
            {
                Console.WriteLine(" " + Element.ValorInt.ToString());
            }
            Console.WriteLine(" "); Console.WriteLine(" ");

            passos = hanoi.colaRecursiva(ini_1.Size, ref ini_1, ref fin_1, ref aux_1);

            Console.WriteLine("Despprés d'executar XXXXXXXXXXXXXXXXXXXXXXXX");
            Console.WriteLine("........................ ");
            Console.WriteLine("Elements en la pila ini_1");
            foreach (Disco Element in ini_1.Elementos)
            {
                Console.WriteLine(" " + Element.ValorInt.ToString());
            }
            Console.WriteLine("........................ ");
            Console.WriteLine("Elements en la pila aux_1");
            foreach (Disco Element in aux_1.Elementos)
            {
                Console.WriteLine(" " + Element.ValorInt.ToString());
            }
            Console.WriteLine("........................ ");
            Console.WriteLine("Elements en la pila fin_1");
            foreach (Disco Element in fin_1.Elementos)
            {
                Console.WriteLine(" " + Element.ValorInt.ToString());
            }
            Console.WriteLine(" "); Console.WriteLine(" ");

            Console.WriteLine(" El número de passos calculat per cola recursivitat son: " + passos.ToString());
            Console.WriteLine("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
            Console.WriteLine("····························································");
            Console.WriteLine("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
            Console.WriteLine(" "); Console.WriteLine(" ");
        }
예제 #4
0
        public ColaRecursiva(int n)
        {
            Hanoi hanoi = new Hanoi();

            Pila ini = new Pila();
            Pila fin = new Pila();
            Pila aux = new Pila();

            for (int i = n; i != 0; i--)
            {
                Disco disco = new Disco();
                disco.ValorInt = i;
                ini.push(disco);
            }

            Console.Write("Discos en pila ini: ");
            foreach (Disco Elemento in ini.Elementos)
            {
                Console.Write(Elemento.ValorInt.ToString() + "; ");
            }
            Console.WriteLine("");

            Console.Write("Discos en pila fin: ");
            foreach (Disco Elemento in fin.Elementos)
            {
                Console.Write(Elemento.ValorInt.ToString() + "; ");
            }
            Console.WriteLine("");

            Console.Write("Discos en pila aux: ");
            foreach (Disco Elemento in aux.Elementos)
            {
                Console.Write(Elemento.ValorInt.ToString() + "; ");
            }
            Console.WriteLine("");

            int movimientos = hanoi.colaRecursiva(n, ref ini, ref fin, ref aux);

            Console.WriteLine("");
            Console.WriteLine("Despues del cálculo las pilas quedan como:");
            Console.WriteLine("");

            Console.Write("Discos en pila ini: ");
            foreach (Disco Elemento in ini.Elementos)
            {
                Console.Write(Elemento.ValorInt.ToString() + "; ");
            }
            Console.WriteLine("");

            Console.Write("Discos en pila fin: ");
            foreach (Disco Elemento in fin.Elementos)
            {
                Console.Write(Elemento.ValorInt.ToString() + "; ");
            }
            Console.WriteLine("");

            Console.Write("Discos en pila aux: ");
            foreach (Disco Elemento in aux.Elementos)
            {
                Console.Write(Elemento.ValorInt.ToString() + "; ");
            }

            Console.WriteLine(" ");
            Console.WriteLine(" ");
            Console.WriteLine("Utilizando recursividad por cola sale que la solución esta");
            Console.WriteLine("Realizado con " + movimientos.ToString() + " movimientos.");
        }
예제 #5
0
        static void Main(string[] args)
        {
            /*
             *
             *          Disco disco5 = new Disco(5);//inicializamos disco con valor 3
             *          Disco disco4 = new Disco(4);//inicializamos disco con valor 3
             *          Disco disco3 = new Disco(3);//inicializamos disco con valor 3
             *          Disco disco2 = new Disco(2);//inicializamos disco con valor 2
             *          Disco disco1 = new Disco(1);//inicializamos disco con valor 1
             *
             *          //------------------------------------------------------------------------------------
             *          Pila ini = new Pila();//inicilizamos pila ini
             *          ini.nombre = "INI";//le ponemos un nombre a la pila
             *
             *          Pila aux = new Pila();//inicializamos la pila aux
             *          aux.nombre = "AUX";//le ponemos un nombre a la pila
             *
             *          Pila fin = new Pila();//inicializamos la pila fin
             *          fin.nombre = "FIN";//le ponemos un nombre a la pila
             *                             //-------------------------------------------------------------------------------------
             *          ini.push(disco5);
             *          ini.push(disco4);
             *          ini.push(disco3);
             *          ini.push(disco2);
             *          ini.push(disco1);
             *          //-------------------------------------------------------------------------------------
             *          //NUMERO DE DISCOS
             *          int discos = 5;
             *
             *
             *          //Hanaoi()
             *          Hanoi sol = new Hanoi();
             *          //-------------------------------------------------------------------------------------
             *          //PRUEVA ITERATIVO
             *          //-------------------------------------------------------------------------------------
             *          int solucion = sol.recursivo(discos, ini, fin, aux);
             *          //-------------------------------------------------------------------------------------
             *
             *          Console.WriteLine("Los movimientos finales son" + solucion);
             *          Console.WriteLine("la pila final:");
             *          fin.impr();
             *          Console.ReadKey();
             *
             */


            Console.WriteLine("¿Qué algoritmo prefieres utilizar? Pulsa 1 para usar el iterativo o 2 para usar el recursivo?");
            int algoritmoUtilizado = Convert.ToInt32(Console.ReadLine());

            Console.WriteLine("¿Cuántos discos quieres insertar?");
            int          numDiscos    = Int32.Parse(Console.ReadLine());
            List <Disco> discoFinales = new List <Disco>();

            if (numDiscos == 0)
            {
                Console.WriteLine("¿Realmente quisiste escribir 0? Con el numero 0 es imposible de realizar.");
                Console.ReadKey();
            }
            if (numDiscos < 0)
            {
                Console.WriteLine("¿Realmente quisiste escribir un número negativo? con un numero negativo no se puede, vuelva a intentarlo.");
                Console.ReadKey();
            }
            if (numDiscos > 0)
            {
                Pila ini = new Pila();
                Pila aux = new Pila();
                Pila fin = new Pila();

                for (int i = numDiscos; i > 0; i--)
                {
                    //discoFinales.Add(new Disco(i));
                    ini.push(new Disco(i));
                }

                Hanoi torres_hanoi = new Hanoi();
                if (algoritmoUtilizado == 1)                                    // si penemos un 1 en pantalla
                {
                    int sol = torres_hanoi.iterativo(numDiscos, ini, fin, aux); // Llamamos  iterativo
                    Console.WriteLine(sol);                                     // mostramos la sol
                }
                if (algoritmoUtilizado == 2)                                    // Si la respuesta del usuario al principio es dos
                {
                    int sol = torres_hanoi.recursivo(numDiscos, ini, fin, aux); // Llamamos recursivo
                    Console.WriteLine(sol);                                     //  mostramos la sol
                }
                if (algoritmoUtilizado > 2)
                {
                    Console.WriteLine("No has introduciddo el numero correcto en el algoritmo");
                }
                Console.ReadKey();
            }
        }
예제 #6
0
파일: Hanoi.cs 프로젝트: andrey342/Hanoi
        public int iterativo(int n, Pila ini, Pila fin, Pila aux)
        {
            int  movimientos = 0;     //variable donde almaceno los movimientos hechos
            bool solucion    = false; //bool para salir del while o no

            if (n % 2 == 0)
            {     //si es par
                while (solucion == false)
                { //mientras que no hay solucion
                    /*------- Movimientos + aumento contador  ---------*/
                    movimientos++;
                    mover_disco(ini, aux);
                    Console.WriteLine("Mover de ini a aux");

                    movimientos++;
                    mover_disco(ini, fin);
                    Console.WriteLine("Mover de ini a fin");

                    movimientos++;
                    mover_disco(aux, fin);
                    Console.WriteLine("Mover de aux a fin");

                    /*------- FIN -> Movimientos + aumento contador ---------*/
                    if (fin.Size.Equals(n))
                    {
                        solucion = true;
                    }
                }
            }
            else
            { //si es impar
                while (solucion == false)
                {
                    /*------- Movimientos + aumento contador  ---------*/


                    mover_disco(ini, fin); //como es impar hacemos que el primer movimiento sea ini -> fin
                    Console.WriteLine("Mover de ini a fin");
                    movimientos++;
                    if (fin.Size.Equals(n)) //si coincide
                    {
                        solucion = true;
                        break; //salir bucle
                    }

                    mover_disco(ini, aux);
                    Console.WriteLine("Mover de ini a aux");
                    movimientos++;

                    mover_disco(aux, fin);
                    Console.WriteLine("Mover de aux a fin");
                    movimientos++;

                    /*------- FIN -> Movimientos + aumento contador ---------*/
                    if (fin.Size.Equals(n))
                    {
                        solucion = true;
                    }
                }
            }
            return(movimientos);
        }
예제 #7
0
        /*
         * n = numero de discos
         * */
        public int iterativo(int n, Pila ini, Pila fin, Pila aux)
        {
            int  movimientos = 0;
            bool haySolucion = false;

            // si n es impar
            if (n % 2 == 1)
            {
                while (!haySolucion)
                {
                    mover_disco(ini, fin);
                    movimientos++;
                    haySolucion = comprobar_victoria(n, fin);

                    Console.WriteLine(ini.ToString());
                    Console.WriteLine(aux.ToString());
                    Console.WriteLine(fin.ToString());
                    if (haySolucion)
                    {
                        break;
                    }

                    mover_disco(ini, aux);
                    movimientos++;
                    haySolucion = comprobar_victoria(n, fin);

                    Console.WriteLine(ini.ToString());
                    Console.WriteLine(aux.ToString());
                    Console.WriteLine(fin.ToString());
                    if (haySolucion)
                    {
                        break;
                    }

                    mover_disco(aux, fin);
                    movimientos++;
                    haySolucion = comprobar_victoria(n, fin);

                    Console.WriteLine(ini.ToString());
                    Console.WriteLine(aux.ToString());
                    Console.WriteLine(fin.ToString());
                    if (haySolucion)
                    {
                        break;
                    }
                }
            }
            // si n es par
            else
            {
                while (!haySolucion)
                {
                    mover_disco(ini, aux);
                    movimientos++;
                    haySolucion = comprobar_victoria(n, fin);

                    Console.WriteLine(ini.ToString());
                    Console.WriteLine(aux.ToString());
                    Console.WriteLine(fin.ToString());
                    if (haySolucion)
                    {
                        break;
                    }

                    mover_disco(ini, fin);
                    movimientos++;
                    haySolucion = comprobar_victoria(n, fin);

                    Console.WriteLine(ini.ToString());
                    Console.WriteLine(aux.ToString());
                    Console.WriteLine(fin.ToString());
                    if (haySolucion)
                    {
                        break;
                    }

                    mover_disco(aux, fin);
                    movimientos++;
                    haySolucion = comprobar_victoria(n, fin);

                    Console.WriteLine(ini.ToString());
                    Console.WriteLine(aux.ToString());
                    Console.WriteLine(fin.ToString());
                    if (haySolucion)
                    {
                        break;
                    }
                }
            }


            return(movimientos);
        }
예제 #8
0
        static void Main(string[] args)
        {
            Pila ini = new Pila();
            Pila aux = new Pila();
            Pila fin = new Pila();

            Hanoi juego = new Hanoi();

            //Número de discos con los que se va a jugar
            int numero = 3;

            Console.WriteLine("********************************************************************************");
            Console.WriteLine("             ALGORITMO ITERATIVO");
            Console.WriteLine("********************************************************************************");

            int movimientos = juego.iterativo(numero, ini, fin, aux);

            Console.WriteLine("El número de movimientos es: " + movimientos + ".");

            if (movimientos == Math.Pow(2, numero) - 1)
            {
                Console.WriteLine("El juego es correcto.");
            }

            Console.WriteLine();

            //Una vez terminado el algoritmo iterativo, borro los discos introducidos en
            //la pila final para volver a reutilizarla antes de empezar el siguiente algoritmo
            for (int i = numero; i > 0; i--)
            {
                fin.pop();
            }

            Console.WriteLine("********************************************************************************");
            Console.WriteLine("             ALGORITMO RECURSIVO");
            Console.WriteLine("********************************************************************************");

            //Creación e introducción de los discos en la pila inicial
            for (int i = numero; i > 0; i--)
            {
                ini.push(new Disco(i));
            }

            //Imprimir los elementos del disco
            for (int i = 0; i <= ini.Elementos.Count - 1; i++)
            {
                Console.WriteLine("Valores de los discos en la pila ini[" + i + "]: " + ini.Elementos[i].Valor);
            }

            Console.WriteLine();
            Console.WriteLine("Número de discos en las pilas => INI: " + ini.Size + " AUX: " + aux.Size + " FIN: " + fin.Size);
            Console.WriteLine("TOP en las pilas => INI: " + ini.Top + " AUX: " + aux.Top + " FIN: " + fin.Top);
            Console.WriteLine();
            Console.WriteLine("EMPIEZA EL JUEGO");

            int movimientosR = juego.recursivo(numero, ini, fin, aux);

            Console.WriteLine("________________________________________________________________________________");
            Console.WriteLine("El número de movimientos es: " + movimientosR + ".");

            if (movimientosR == Math.Pow(2, numero) - 1)
            {
                Console.WriteLine("El juego es correcto.");
            }

            // Keep the console window open in debug mode.
            Console.WriteLine("Press any key to exit.");
            Console.ReadKey();
        }
예제 #9
0
        static void Main(string[] args)
        {
            bool numeroValido   = false;
            bool eleccionValida = false;

            Console.WriteLine("Buenos días, elija una opción por favor por favor :)");
            Console.WriteLine("Pulse 1 para utilizar el algoritmo iterativo");
            Console.WriteLine("Pulse 2 para utilizar el algoritmo recursivo");

            while (!eleccionValida)
            {
                try
                {
                    int elección = Int32.Parse(Console.ReadLine());

                    while (!numeroValido)
                    { //Este While comprueba que hayas introducido un número válido
                        try
                        {
                            if (elección == 1)
                            {
                                Console.WriteLine("Ingrese el número de discos");
                                int totalDiscos = Int32.Parse(Console.ReadLine());


                                int          formula   = (int)(Math.Pow(2, totalDiscos) - 1);
                                List <Disco> Elementos = new List <Disco>();
                                for (int i = totalDiscos; i > 0; i--)
                                {
                                    Elementos.Add(new Disco(i));
                                }

                                Pila pilaIni = new Pila(Elementos);
                                Pila pilaAux = new Pila();
                                Pila pilaFin = new Pila();


                                Hanoi El_problema_de_hanoi = new Hanoi();
                                int   numMovimientos       = El_problema_de_hanoi.iterativo(totalDiscos, pilaIni, pilaFin, pilaAux);

                                Console.WriteLine("El problema con " + totalDiscos + " discos se ha resuelto en " + numMovimientos + " movimientos.");

                                if (numMovimientos == formula)
                                {
                                    Console.WriteLine("El problema se ha resuelto bien :)");
                                }
                                else
                                {
                                    Console.WriteLine("El problema se ha resuelto mal :(");
                                }
                                numeroValido = true; //Si todo va bien, salimos del while
                                Console.WriteLine("Pulse cualquier tecla para salir");
                                Console.ReadKey();
                            }
                            else if (elección == 2)
                            {
                                Console.WriteLine("Ingrese el número de discos");
                                int totalDiscos = Int32.Parse(Console.ReadLine());


                                int          formula   = (int)(Math.Pow(2, totalDiscos) - 1);
                                List <Disco> Elementos = new List <Disco>();
                                for (int i = totalDiscos; i > 0; i--)
                                {
                                    Elementos.Add(new Disco(i));
                                }

                                Pila pilaIni = new Pila(Elementos);
                                Pila pilaAux = new Pila();
                                Pila pilaFin = new Pila();


                                Hanoi El_problema_de_hanoi = new Hanoi();
                                int   numMovimientos       = El_problema_de_hanoi.Recursivo(totalDiscos, pilaIni, pilaFin, pilaAux);

                                Console.WriteLine("El problema con " + totalDiscos + " discos se ha resuelto en " + numMovimientos + " movimientos.");

                                if (numMovimientos == formula)
                                {
                                    Console.WriteLine("El problema se ha resuelto bien :)");
                                }
                                else
                                {
                                    Console.WriteLine("El problema se ha resuelto mal :(");
                                }
                                numeroValido = true; //Si todo va bien, salimos del while
                                Console.WriteLine("Pulse cualquier tecla para salir");
                                Console.ReadKey();
                            }
                            else
                            {
                                Console.WriteLine("Muy gracioso, ingrese una elección válida");
                                elección = Int32.Parse(Console.ReadLine());
                            }
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine("Por favor, ingrese un número válido");
                            //Si ha ingresado un número negativo, o una tecla o cualquier otro símbolo volvemos a empezar
                        }
                    }
                    eleccionValida = true;
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Muy gracioso, ingrese una elección válida");
                }
            }
        }
예제 #10
0
 public static void rellenarPilaIni(Pila pilaIni, int n)
 {
     pilaIni.rellenarPila(n);
 }
예제 #11
0
        public int iterativo(int n, Pila ini, Pila fin, Pila aux)
        {
            int  numero_movimientos = 0;
            bool noSolucionado      = true;

            if (n % 2 != 0)
            {
                while (noSolucionado)
                {
                    //Console.WriteLine("Inicio bucle   ");
                    //Console.WriteLine("Size fin-->  " +fin.Size);
                    // Console.WriteLine(noSolucionado);
                    mover_disco(ini, fin);
                    numero_movimientos++;

                    if (fin.Size == n)
                    {
                        noSolucionado = false;
                        break;
                    }
                    mover_disco(ini, aux);
                    numero_movimientos++;
                    if (fin.Size == n)
                    {
                        noSolucionado = false;
                        break;
                    }
                    mover_disco(aux, fin);
                    numero_movimientos++;
                    if (fin.Size == n)
                    {
                        noSolucionado = false;
                        break;
                    }
                } //fin mientras
            }     //fin si

            if (n % 2 == 0)
            {
                while (noSolucionado)
                {
                    mover_disco(ini, aux);
                    numero_movimientos++;
                    if (fin.Size == n)
                    {
                        noSolucionado = false;
                        break;
                    }
                    mover_disco(ini, fin);
                    numero_movimientos++;
                    if (fin.Size == n)
                    {
                        noSolucionado = false;
                        break;
                    }
                    mover_disco(aux, fin);
                    numero_movimientos++;
                    if (fin.Size == n)
                    {
                        noSolucionado = false;
                        break;
                    }
                } //fin mientras
            }     //fin si


            return(numero_movimientos);
        }
예제 #12
0
        /*Iterativo*/
        public int iterativo(int n, Pila ini, Pila fin, Pila aux)
        {
            if (n % 2 == 0)
            {
                while (fin.Size < n)
                {
                    mover_disco(aux, ini);

                    /*Se muestra el movimiento por consola*/
                    if (direccion == 1)
                    {
                        Console.WriteLine("Se a movido el disco de ini a aux");
                    }
                    else
                    {
                        Console.WriteLine("Se a movido el disco de aux a ini");
                    }
                    /*---------------------------------------------------------------*/
                    mover_disco(ini, fin);
                    /*Se muestra el movimiento por consola*/
                    if (direccion == 1)
                    {
                        Console.WriteLine("Se a movido el disco de fin a ini");
                    }
                    else
                    {
                        Console.WriteLine("Se a movido el disco de ini a fin");
                    }
                    /*---------------------------------------------------------------*/

                    if (fin.Size == n)
                    {
                        return(m);
                    }

                    mover_disco(fin, aux);
                    /*Se muestra el movimiento por consola*/
                    if (direccion == 1)
                    {
                        Console.WriteLine("Se a movido el disco de aux a fin");
                    }
                    else
                    {
                        Console.WriteLine("Se a movido el disco de fin a aux");
                    }
                    /*---------------------------------------------------------------*/

                    if (fin.Size == n)
                    {
                        return(m);
                    }
                }
            }
            if (n % 2 != 0 || n == 1)
            {
                while (fin.Size < n)
                {
                    mover_disco(ini, fin);
                    /*Se muestra el movimiento por consola*/
                    if (direccion == 1)
                    {
                        Console.WriteLine("Se a movido el disco de fin a ini");
                    }
                    else
                    {
                        Console.WriteLine("Se a movido el disco de ini a fin");
                    }
                    /*---------------------------------------------------------------*/

                    if (fin.Size == n)
                    {
                        return(m);
                    }
                    mover_disco(ini, aux);
                    /*Se muestra el movimiento por consola*/
                    if (direccion == 1)
                    {
                        Console.WriteLine("Se a movido el disco de aux a ini");
                    }
                    else
                    {
                        Console.WriteLine("Se a movido el disco de ini a aux");
                    }
                    /*---------------------------------------------------------------*/

                    mover_disco(aux, fin);
                    /*Se muestra el movimiento por consola*/
                    if (direccion == 1)
                    {
                        Console.WriteLine("Se a movido el disco de fin a aux");
                    }
                    else
                    {
                        Console.WriteLine("Se a movido el disco de aux a fin");
                    }
                    /*---------------------------------------------------------------*/
                    if (fin.Size == n)
                    {
                        return(m);
                    }
                }
            }
            return(m);
        }
예제 #13
0
        public int iterativo(int n, Pila ini, Pila fin, Pila aux)
        {
            bool seguirBucle = true;

            if (n % 2 != 0)//para si son impares
            {
                Console.WriteLine(" ES IMPAR");
                while (seguirBucle == true)//mientras que no esten todos en la ultima columna haz esto
                {
                    if (fin.Size < n)
                    {
                        mover_disco(ini, fin);         //movimiento de ini a fin
                        movimientos = movimientos + 1; //sumamos 1 movimiento
                    }


                    if (fin.Size < n)
                    {
                        mover_disco(ini, aux);         //movimiento de ini a aux
                        movimientos = movimientos + 1; //sumamos 1 movimiento
                    }

                    if (fin.Size < n)
                    {
                        mover_disco(aux, fin);         //movimiento de aux a fin
                        movimientos = movimientos + 1; //sumamos 1 movimient
                    }
                    if (fin.Size == n)
                    {
                        seguirBucle = false;//para para el while ya que seguir bucle es bool
                    }
                }
            }
            else//el caso para cuando sean pares
            {
                Console.WriteLine("ES PAR");
                while (seguirBucle == true)
                {
                    if (fin.Size < n)
                    {
                        mover_disco(ini, aux); //movimiento de ini a aux
                        movimientos++;         //sumamos 1 movimiento
                    }
                    if (fin.Size < n)
                    {
                        mover_disco(ini, fin); //movimiento de ini a fin
                        movimientos++;         //sumamos 1 movimiento
                    }
                    if (fin.Size < n)
                    {
                        mover_disco(aux, fin); //movimiento de aux a fin
                        movimientos++;         //sumamos 1 movimiento
                    }
                    if (fin.Size == n)
                    {
                        seguirBucle = false;
                    }
                }
            }
            return(movimientos);//devolcemos los movimientos
        }
예제 #14
0
        //metodo iterativo
        public int iterativo(int x, Pila ini, Pila fin, Pila aux)
        {
            int  cuantos = 0;                //movimientos que realizaremos
            bool resFin;                     //variable para saber si se ha acabado

            resFin = false;                  //como esto no esta acabado se inicializa en false
            if (x % 2 == 0)                  //si los discos son pares
            {
                while (resFin.Equals(false)) //mientras no hay resultado n == numero de discos en fin
                {
                    Console.WriteLine("Movimiento inicio a aux");
                    mover_disco(ini, aux);
                    cuantos++;//contamos un movimiento



                    Console.WriteLine("Movimiento inicio a fin");
                    mover_disco(ini, fin);
                    cuantos++;//el siguiente movimiento


                    Console.WriteLine("Movimiento aux a fin");
                    mover_disco(aux, fin);
                    cuantos++;              //el tercer movimiento
                    if (fin.Size.Equals(x)) //al acabar todos los movimientos comprobamos si el tamanyo de fin es el tamanyo de los discos
                    {
                        resFin = true;
                    }
                }
            }
            else//si el numero es impar
            {
                while (resFin.Equals(false))
                {
                    cuantos++;
                    Console.WriteLine("Movimiento inicio a fin");
                    mover_disco(ini, fin);
                    //comprobamos si ya ha terminado porque es impar, para evitar bucles
                    if (fin.Size.Equals(x))
                    {
                        resFin = true; //si la ultima pila tiene el numero que hemos introducido
                        return(cuantos);
                    }
                    //realizamos el resto de movimientos restantes
                    cuantos++;
                    Console.WriteLine("Movimiento inicio a aux");
                    mover_disco(ini, aux);

                    cuantos++;
                    Console.WriteLine("Movimiento aux a fin");
                    mover_disco(aux, fin);

                    if (fin.Size.Equals(x))
                    {
                        resFin = true;
                        return(cuantos);
                    }
                    //al realizar el tercer movimiento, comprobamos si ya esta el resultado
                }
            }
            return(cuantos); //devolvemos los movimientos realizados
        }
예제 #15
0
 public bool isSolved(Pila p, uint n)
 {
     return(p.Size == n);
 }
예제 #16
0
 public int algoritmoRecursivo(int n, Pila ini, Pila fin, Pila aux)
 {
     discos      = n;
     movimientos = algoritmoRecursivoReal(n, ini, fin, aux);
     return(movimientos);
 }
예제 #17
0
파일: Program.cs 프로젝트: pdepau/hanoi
        static void Main(string[] args)
        {
            int t;

            Pila ini = new Pila();
            Pila aux = new Pila();
            Pila fin = new Pila();

            Console.WriteLine("bienvenido al juego de las torres de hanoi");

            Console.WriteLine("");
            Console.WriteLine("Indica el número de discos...");
            string key = Console.ReadLine();


            while (!Int32.TryParse(key, out t))
            {
                Console.WriteLine("");
                Console.WriteLine("Porfavor introduce un numero valido");
                key = Console.ReadLine();
            }

            while (Int32.Parse(key) <= 0)
            {
                Console.WriteLine("Acaso crees que poner un numero negativo es buena idea? vengA prueba otra vez");
                Console.WriteLine("");
                Console.WriteLine("Introduce un número valido...");
                key = Console.ReadLine();
            }
            if (key != "0")
            {
                Console.WriteLine("");
                Console.WriteLine("Has elegido " + key + " discos.");

                Pila INI = new Pila(Int32.Parse(key));
                ini = INI;


                Hanoi hanoi = new Hanoi();

                Console.WriteLine("");
                Console.WriteLine("Pulsa (I) para Iterativo, pulsa (R) para Recursivo...");
                string key2 = Console.ReadLine();
                key2 = key2.ToUpper();
                while (key2 != "I" && key2 != "R")
                {
                    Console.WriteLine("");
                    Console.WriteLine("Valor no reconocido, introduce (I) o (R)...");
                    key2 = Console.ReadLine();
                    key2 = key2.ToUpper();
                }
                switch (key2)
                {
                case "I":
                    int c = hanoi.iterativo(Int32.Parse(key), ini, fin, aux);
                    Console.WriteLine("");
                    Console.WriteLine("Se ha completado en " + c + " movimientos");
                    break;

                case "R":
                    int d = hanoi.recursivo(Int32.Parse(key), ini, fin, aux);
                    Console.WriteLine("");
                    Console.WriteLine("Se ha completado en " + d + " movimientos");
                    break;
                }
            }
            else
            {
                Console.WriteLine("No se puede jugar con 0 discos");
            }

            // Keep the console window open in debug mode.
            Console.WriteLine("Press any key to exit.");
            Console.ReadKey();
        }
예제 #18
0
        static void Main(string[] args)
        {
            /*Inicializacion de las pilas*/

            Pila ini = new Pila();
            Pila aux = new Pila();
            Pila fin = new Pila();
            int  numDisc;

            Console.WriteLine("Juego de las torres de Hanoi");
            Console.WriteLine("");

            /*Se introducen los discos*/

            Console.WriteLine("Cuantos Discos ?");
            string key = Console.ReadLine();

            while (!Int32.TryParse(key, out numDisc))
            {
                Console.WriteLine("Cuantos Discos ?");
                key = Console.ReadLine();
            }
            for (int i = 0; i < numDisc; i++)
            {
                Disco d = new Disco(numDisc - i);

                ini.push(d);
            }



            Hanoi hanoi = new Hanoi();

            /*Se pregunta si Iterativo o Recursivo*/

            Console.WriteLine("Iterativo(I) - Recursivo(R)");
            string key2 = Console.ReadLine();

            key2 = key2.ToUpper();
            while (key2 != "I" && key2 != "R")
            {
                Console.WriteLine("Iterativo(I) - Recursivo(R)");
                key2 = Console.ReadLine();
                key2 = key2.ToUpper();
            }

            /*Se resuelve con la opción escogida*/

            switch (key2)
            {
            case "I":
                int movs = hanoi.iterativo(numDisc, ini, fin, aux);

                Console.WriteLine("Numero de movimientos: " + movs.ToString());
                break;

            case "R":
                int movs2 = hanoi.recursivo(numDisc, ini, fin, aux);

                Console.WriteLine("Numero de movimientos: " + movs2.ToString());
                break;
            }


            // Keep the console window open in debug mode.
            Console.WriteLine("Press any key to exit.");
            Console.ReadKey();
        }
예제 #19
0
        public int iterativo(int n, Pila ini, Pila fin, Pila aux)
        {
            int m = 0;

            if (n % 2 != 0)
            {
                while (fin.Size != n)
                {
                    mover_disco(ini, fin);
                    m++;
                    if (fin.Size == n)
                    {
                        break;
                    }
                    redactar(n, ini, fin, aux, m);

                    mover_disco(ini, aux);
                    m++;
                    if (fin.Size == n)
                    {
                        break;
                    }
                    redactar(n, ini, fin, aux, m);

                    mover_disco(aux, fin);
                    m++;
                    if (fin.Size == n)
                    {
                        break;
                    }
                    redactar(n, ini, fin, aux, m);
                }
            }

            if (n % 2 == 0)
            {
                while (fin.Size != n)
                {
                    mover_disco(ini, aux);
                    m++;
                    redactar(n, ini, fin, aux, m);
                    if (fin.Size == n)
                    {
                        break;
                    }

                    mover_disco(ini, fin);
                    m++;
                    redactar(n, ini, fin, aux, m);
                    if (fin.Size == n)
                    {
                        break;
                    }

                    mover_disco(aux, fin);
                    m++;
                    redactar(n, ini, fin, aux, m);
                    if (fin.Size == n)
                    {
                        break;
                    }
                }
            }

            redactar(n, ini, fin, aux, m);
            Console.WriteLine("El número total de discos es: " + fin.Size);
            Console.WriteLine("El número de total de movimientos es: " + m);
            return(m);
        }
예제 #20
0
        static void Main(string[] args)
        {
            /*  //prueba de funcionamiento clase pila
             * Disco hola = new Disco(1);
             * Disco holat = new Disco(2);
             * Pila pila = new Pila();
             * pila.push(holat);
             * pila.push(hola);
             * pila.pop();
             * Console.WriteLine("coprov si funciona, dime tamanyo "+pila.Size.ToString());
             * //----------------------
             *
             * //prueba funcionamiento pila con la clase hanoi (mover_disco())
             * Pila pilas = new Pila();
             * Hanoi hanoi = new Hanoi();
             * hanoi.mover_disco(pila,pilas);
             * Console.WriteLine("tam pila primera"+pila.Size.ToString());
             * Console.WriteLine("tam pila segunda"+pilas.Size.ToString());*/
            //---------------------------
            //prueba de funcionamiento iterativo()

            Hanoi iter  = new Hanoi(); //definimos el método iterativo
            Pila  pila1 = new Pila();  // las pilas
            Pila  pila2 = new Pila();
            Pila  pila3 = new Pila();

            Console.WriteLine("Introduzca el numero de discos para iterativo");
            int x = Convert.ToInt32(Console.ReadLine()); //pedimos el numero de discos

            while (x <= 0)                               //comprobamos si hay un numero mayor a 0
            {
                Console.WriteLine("Introduce un numero mayor a 0");
                x = Convert.ToInt32(Console.ReadLine()); //pedimos el numero de discos
            }

            for (int i = x; i > 0; i--)//introduciomos los discos en la pila ordenandolos del disco más grande al pequenyo en la pila
            {
                pila1.push(new Disco(i));
            }

            int res = iter.iterativo(x, pila1, pila2, pila3);

            Console.WriteLine(res.ToString());

            //--------------------------------------------------------------------------------------------------------------------------------------------------------
            // probamos el reiterativo
            Hanoi reiter = new Hanoi(); //definimos el método reiterativo
            Pila  pila4  = new Pila();  // las pilas
            Pila  pila5  = new Pila();
            Pila  pila6  = new Pila();

            Console.WriteLine("Introduzca el numero de discos para reiterativo");
            int y = Convert.ToInt32(Console.ReadLine()); //pedimos el numero de discos

            while (y <= 0)                               //comprobamos si hay un numero mayor a 0
            {
                Console.WriteLine("Introduce un numero mayor a 0");
                y = Convert.ToInt32(Console.ReadLine()); //pedimos el numero de discos
            }

            for (int i = y; i > 0; i--)//introduciomos los discos en la pila ordenandolos del disco más grande al pequenyo en la pila
            {
                pila4.push(new Disco(i));
            }

            int resiter = iter.iterativo(y, pila4, pila5, pila6);

            Console.WriteLine(resiter.ToString());



            // Keep the console window open in debug mode.

            Console.ReadKey();
        }
예제 #21
0
파일: Program.cs 프로젝트: andrey342/Hanoi
        static void Main(string[] args)
        {
            // Keep the console window open in debug mode.
            Console.WriteLine("Introduce I si quieres usar el algoritmo iterativo");
            Console.WriteLine("Introduce R si quieres usar el algoritmo recursivo");
            string comandoEscrito = Console.ReadLine();

            if (comandoEscrito == "I" || comandoEscrito == "R")
            {
                Console.WriteLine("Introduce el numero de discos : ");
                int numDiscos = Convert.ToInt32(Console.ReadLine());

                //Torre de Hanoi
                Hanoi hanoi = new Hanoi();

                //lista de discos
                List <Disco> Elementos = new List <Disco>();

                //pilas
                Pila ini = new Pila();
                Pila aux = new Pila();
                Pila fin = new Pila();

                //rellenar pila ini
                for (int i = numDiscos; i > 0; i--)
                {
                    ini.push(new Disco(i));
                }
                if (comandoEscrito == "I")
                { //interativo
                  //Aca empieza lo chido
                    int mov = hanoi.iterativo(numDiscos, ini, fin, aux);

                    //Formula
                    double formulaDouble = Math.Pow(2, numDiscos) - 1;
                    int    formulaGucci  = Convert.ToInt32(formulaDouble);

                    //Respuestas
                    Console.WriteLine("Resultado moviendo discos entre pilas: " + mov);
                    Console.WriteLine("Resultado calculado con la formula es: " + formulaGucci);
                    if (mov.Equals(formulaGucci))
                    {
                        Console.WriteLine("El resultado es CORRECTO");
                    }
                    else
                    {
                        Console.WriteLine("El resultado es INCORRECTO");
                    }
                }
                else if (comandoEscrito == "R") //recurivo
                {
                    //Aca empieza lo chido
                    int mov = hanoi.recursivo(numDiscos, ini, fin, aux);

                    //Formula
                    double formulaDouble = Math.Pow(2, numDiscos) - 1;
                    int    formulaGucci  = Convert.ToInt32(formulaDouble);

                    //Respuestas
                    Console.WriteLine("Resultado moviendo discos entre pilas: " + mov);
                    Console.WriteLine("Resultado calculado con la formula es: " + formulaGucci);
                    if (mov.Equals(formulaGucci))
                    {
                        Console.WriteLine("El resultado es CORRECTO");
                    }
                    else
                    {
                        Console.WriteLine("El resultado es INCORRECTO");
                    }
                }
            }
            else
            {
                Console.WriteLine(" Comando incorrecto , una I o una R");
            }
            Console.ReadKey();
        }
예제 #22
0
        public int iterativo(int n, Pila ini, Pila fin, Pila aux)
        {
            int  movimientos = 0;
            bool solucion    = false;

            if (n % 2 == 0)
            {
                while (!solucion)
                {
                    /*incrementar movimientos(m) ← mover disco(INI, AUX)
                     * 6: incrementar movimientos(m) ← mover disco(INI, FIN)
                     * 7: incrementar movimientos(m) ← mover disco(AUX, FIN)*/

                    movimientos++;
                    Console.WriteLine("Movimiento inicio a fin");
                    mover_disco(ini, aux);

                    movimientos++;
                    Console.WriteLine("Movimiento inicio a aux");
                    mover_disco(ini, fin);

                    movimientos++;
                    Console.WriteLine("Movimiento aux a fin");
                    mover_disco(aux, fin);


                    if (fin.Size == n)
                    {
                        //Si la pila final tiene todos los discos, paramos el programa
                        Console.WriteLine("Graasia Diego");
                        solucion = true;
                    }
                }
            }
            else
            {
                while (!solucion)
                {
                    /*incrementar movimientos(m) ← mover disco(INI, FIN)
                    *  incrementar movimientos(m) ← mover disco(INI, AUX)
                    *  incrementar movimientos(m) ← mover disco(AUX, FIN)*/

                    if (fin.Size == n)
                    {
                        //Si la pila final tiene todos los discos, paramos el programa
                        solucion = true;
                        return(movimientos);
                    }

                    movimientos++;
                    Console.WriteLine("Movimiento inicio a aux");
                    mover_disco(ini, fin);
                    if (fin.Size == n)
                    {
                        //Si la pila final tiene todos los discos, paramos el programa
                        solucion = true;
                        return(movimientos);
                    }

                    movimientos++;
                    Console.WriteLine("Movimiento inicio a fin");
                    mover_disco(ini, aux);

                    if (fin.Size == n)
                    {
                        //Si la pila final tiene todos los discos, paramos el programa
                        solucion = true;
                        return(movimientos);
                    }

                    movimientos++;
                    Console.WriteLine("Movimiento aux a fin");
                    mover_disco(aux, fin);

                    if (fin.Size == n)
                    {
                        //Si la pila final tiene todos los discos, paramos el programa
                        solucion = true;
                        return(movimientos);
                    }
                }
            }

            return(movimientos);
        }
예제 #23
0
        static TestPila()
        {
            Disco disco_1 = new Disco();

            disco_1.ValorInt = 1;

            Disco disco_2 = new Disco();

            disco_2.ValorInt = 2;

            Disco disco_3 = new Disco();

            disco_3.ValorInt = 3;

            /*---------------------------------------------*/

            /*  TESTING:
             *  Creació de pila */
            /*---------------------------------------------*/
            Console.WriteLine(" =================================================================================================");
            Console.WriteLine("  Creació de pila ");
            Pila pila_A = new Pila();
            Pila pila_B = new Pila();
            Pila pila_C = new Pila();


            int  size_A  = pila_A.Size;
            bool buida_A = pila_A.isEmpty();

            Console.WriteLine("Tamany de pila_A: " + size_A.ToString());
            Console.WriteLine("Està buida pila_A: " + buida_A.ToString());
            Console.WriteLine();

            /*---------------------------------------------*/

            /*  TESTING:
             *  Checking top de una pila buida (pila_A) */
            /*---------------------------------------------*/
            Console.WriteLine(" =================================================================================================");
            Console.WriteLine("  Checking top de una pila buida (pila_A) ");
            Console.WriteLine("top de pila_A buida: " + pila_A.Top.ToString());
            Console.WriteLine();

            /*---------------------------------------------*/

            /*  TESTING:
             *  Pushing en una pila buida un disco (pila_A, disco_3) */
            /*---------------------------------------------*/
            Console.WriteLine(" =================================================================================================");
            Console.WriteLine("  Pushing en una pila buida un disco (pila_A, disco_3) ");
            pila_A.push(disco_3);
            Console.WriteLine("disco en top pila (pila_A es Disco 3): " + pila_A.Top.ToString());
            Console.WriteLine();

            /*---------------------------------------------*/

            /*  TESTING:
             *  Elements en una pila buida (pila_B) */
            /*---------------------------------------------*/
            Console.WriteLine(" =================================================================================================");
            Console.WriteLine(" Elements en una pila buida (pila_B) ");
            List <Disco> Elements_B = pila_B.Elementos;

            int Total_B = 0;

            Console.WriteLine("Elements en la pila buida ");
            foreach (Disco Element in Elements_B)
            {
                Console.WriteLine(" " + Element.ValorInt.ToString());
                Total_B++;
            }
            Console.WriteLine("Total: " + Total_B.ToString());
            Console.WriteLine();

            /*---------------------------------------------*/

            /*  TESTING:
             *  Elements en una pila amb un disco (pila_A) */
            /*---------------------------------------------*/
            Console.WriteLine(" =================================================================================================");
            Console.WriteLine(" Elements en una pila amb un disco (pila_A) ");
            List <Disco> Elements_A = pila_A.Elementos;

            int Total_A = 0;

            Console.WriteLine("Elements en la pila ");
            foreach (Disco Element in Elements_A)
            {
                Console.WriteLine(" " + Element.ValorInt.ToString());
                Total_A++;
            }
            Console.WriteLine("Total: " + Total_A.ToString());
            Console.WriteLine();

            /*---------------------------------------------*/

            /*  TESTING:
             *  Elements en una pila amb varis discos disco (pila_C) */
            /*---------------------------------------------*/
            Console.WriteLine(" =================================================================================================");
            Console.WriteLine(" Elements en una pila amb varis discos disco (pila_C) ");
            pila_C.push(disco_3);
            pila_C.push(disco_2);
            pila_C.push(disco_1);

            List <Disco> Elements_C = pila_C.Elementos;

            int Total_C = 0;

            Console.WriteLine("Elements en la pila ");
            foreach (Disco Element in Elements_C)
            {
                Console.WriteLine(" " + Element.ValorInt.ToString());
                Total_C++;
            }
            Console.WriteLine("Total: " + Total_C.ToString());
            Console.WriteLine();

            /*---------------------------------------------*/

            /*  TESTING:
             *  Poping de una pila amb sols un disco (pila_A disco_3) */
            /*---------------------------------------------*/
            Console.WriteLine(" =================================================================================================");
            Console.WriteLine(" Poping de una pila amb sols un disco (pila_A disco_3) ");
            Console.WriteLine("Disco extret: " + pila_A.pop().ValorInt.ToString());
            Console.WriteLine("La pila queda buida: " + pila_A.isEmpty().ToString());
            Console.WriteLine();

            /*---------------------------------------------*/

            /*  TESTING:
             *  Poping una pila fins a buidar-la (pila_C) */
            /*---------------------------------------------*/
            Console.WriteLine(" =================================================================================================");
            Console.WriteLine(" Poping una pila fins a buidar-la (pila_C) ");
            Total_C = 0;
            while (!pila_C.isEmpty())
            {
                Console.WriteLine("Disco extret: " + pila_C.pop().ValorInt.ToString());
                Total_C++;
            }
            Console.WriteLine("Total: " + Total_C.ToString());
            Console.WriteLine("La pila queda buida: " + pila_A.isEmpty().ToString());
            Console.WriteLine();
        }
예제 #24
0
        public int iterativo(int n, Pila ini, Pila fin, Pila aux)
        {
            int movimientos = 0;

            if (n % 2 != 0)
            {
                while (!comprobar(fin, n))
                {
                    if (ini.Top != 0 && (fin.Top > ini.Top || fin.Top == 0))
                    {
                        mover_disco(ini, fin);
                        Console.WriteLine("Mover disco " + ini.Top + " de la pila " + ini.Name + " a la " + fin.Name);
                        movimientos++;
                    }
                    else if (fin.Top != 0 && (fin.Top < ini.Top || ini.Top == 0))
                    {
                        mover_disco(fin, ini);
                        Console.WriteLine("Mover disco " + fin.Top + " de la pila " + fin.Name + " a la " + ini.Name);
                        movimientos++;
                    }



                    if (!comprobar(fin, n))
                    {
                        if (ini.Top != 0 && (aux.Top > ini.Top || aux.Top == 0))
                        {
                            mover_disco(ini, aux);
                            Console.WriteLine("Mover disco " + ini.Top + " de la pila " + ini.Name + " a la " + aux.Name);
                            movimientos++;
                        }
                        else if (aux.Top != 0 && (aux.Top < ini.Top || ini.Top == 0))
                        {
                            mover_disco(aux, ini);
                            Console.WriteLine("Mover disco " + aux.Top + " de la pila " + aux.Name + " a la " + ini.Name);
                            movimientos++;
                        }
                    }


                    if (!comprobar(fin, n))
                    {
                        if (ini.Top != 0 && (fin.Top > aux.Top || fin.Top == 0))
                        {
                            mover_disco(aux, fin);
                            Console.WriteLine("Mover disco " + aux.Top + " de la pila " + aux.Name + " a la " + fin.Name);
                            movimientos++;
                        }
                        else if (aux.Top != 0 && (fin.Top < aux.Top || aux.Top == 0))
                        {
                            mover_disco(fin, aux);
                            Console.WriteLine("Mover disco " + aux.Top + " de la pila " + fin.Name + " a la " + aux.Name);
                            movimientos++;
                        }
                    }
                }
            }
            else
            {
                while (!comprobar(fin, n))
                {
                    if (ini.Top != 0 && (aux.Top > ini.Top || aux.Top == 0))
                    {
                        mover_disco(ini, aux);
                        Console.WriteLine("Mover disco " + ini.Top + " de la pila " + ini.Name + " a la " + aux.Name);
                        movimientos++;
                    }
                    else if (aux.Top != 0 && (aux.Top < ini.Top || ini.Top == 0))
                    {
                        mover_disco(aux, ini);
                        Console.WriteLine("Mover disco " + aux.Top + " de la pila " + aux.Name + " a la " + ini.Name);
                        movimientos++;
                    }


                    if (!comprobar(fin, n))
                    {
                        if (ini.Top != 0 && (fin.Top > ini.Top || fin.Top == 0))
                        {
                            mover_disco(ini, fin);
                            Console.WriteLine("Mover disco " + ini.Top + " de la pila " + ini.Name + " a la " + fin.Name);
                            movimientos++;
                        }
                        else if (fin.Top != 0 && (fin.Top < ini.Top || ini.Top == 0))
                        {
                            mover_disco(fin, ini);
                            Console.WriteLine("Mover disco " + fin.Top + " de la pila " + fin.Name + " a la " + ini.Name);
                            movimientos++;
                        }
                    }


                    if (!comprobar(fin, n))
                    {
                        if (fin.Top != 0 && (fin.Top > aux.Top || fin.Top == 0))
                        {
                            mover_disco(aux, fin);
                            Console.WriteLine("Mover disco " + aux.Top + " de la pila " + aux.Name + " a la " + fin.Name);
                            movimientos++;
                        }
                        else if (aux.Top != 0 && (fin.Top < aux.Top || aux.Top == 0))
                        {
                            mover_disco(fin, aux);
                            Console.WriteLine("Mover disco " + aux.Top + " de la pila " + fin.Name + " a la " + aux.Name);
                            movimientos++;
                        }
                    }
                }
            }


            return(movimientos);
        }
예제 #25
0
        static void Main(string[] args)
        {
            Pila ini = new Pila();
            Pila aux = new Pila();
            Pila fin = new Pila();

            Console.WriteLine("¿Cuantos discos quieres?");
            int  cantidadDiscos = 0;
            int  pesoDisco      = 1;     // El peso del disco en cada momento que pedimos uno.
            bool pesoCorrecto   = false; // Nos dice si el peso introducido es inferior al anterior

            try
            {
                cantidadDiscos = int.Parse(Console.ReadLine());
                if (cantidadDiscos == 0)
                {
                    Console.WriteLine("¿Cuantos discos quieres?");
                    cantidadDiscos = 0;
                    cantidadDiscos = int.Parse(Console.ReadLine());
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("Has puesto un valor no aceptado");
            }


            for (int i = 1; i <= cantidadDiscos; i++)
            {
                try
                {
                    // Creamos un While para que pregunte el peso del disco mientras no sea inferior al anterior
                    while (!pesoCorrecto)
                    {
                        // Preguntamos el peso que quiere de disco
                        Console.WriteLine("¿De que tamaño quieres que sea el disco " + i + "?" + "\n\n\t Como mínimo debería de ser de " + (cantidadDiscos - i + 1));
                        pesoDisco = int.Parse(Console.ReadLine()); // Añadimos el peso a la variable pesoDisco

                        // Si un disco tiene peso 0 nos da error a la hora de hacer el hanoi
                        if (pesoDisco != 0 && pesoDisco > 0 && pesoDisco >= (cantidadDiscos - i + 1))
                        {
                            // Comprovamos si la lista ini está vacía
                            if (ini.isEmpty())
                            {
                                // Si está insertamos el disco directamente
                                ini.push(new Disco(pesoDisco));
                                pesoCorrecto = true;
                            }
                            else // Entramos si la pila ini tiene algún disco
                            {
                                // Preguntamos el peso del disco es inferior al que está ya puesto
                                if (ini.Top > pesoDisco)
                                {
                                    pesoCorrecto = true;            // Ponemos que el peso introducido es correcto
                                    ini.push(new Disco(pesoDisco)); // Creamos un disco y lo insertamos en ini
                                }
                            }
                        }
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine("Has puesto un valor no aceptado");
                    i--;
                }

                pesoCorrecto = false;
            }

            Hanoi hanoi = new Hanoi();

            Console.WriteLine("Llamamos a iterativo: ");
            int movimientosHechos = hanoi.iterativo(cantidadDiscos, ini, fin, aux);

            //Console.WriteLine("Llamamos a recursivo: ");
            //int movimientosHechos = hanoi.recursivo(cantidadDiscos, ini, fin, aux);

            double movimientoRequeridos = Math.Pow(2, cantidadDiscos) - 1;

            Console.WriteLine("Número de discos: " + cantidadDiscos);
            Console.WriteLine("Número de movimentos necesarios mínimos: " + movimientoRequeridos);
            Console.WriteLine("Número de movimentos hechos: " + movimientosHechos);



            // Keep the console window open in debug mode.
            Console.WriteLine("Press any key to exit.");
            Console.ReadKey();
        }
예제 #26
0
        public int iterativo(int n, Pila ini, Pila fin, Pila aux)
        {
            int m = 0;

            //Creación e introducción de los discos en la pila inicial
            for (int i = n; i > 0; i--)
            {
                ini.push(new Disco(i));
            }
            //Imprimir los elementos del disco
            for (int i = 0; i <= ini.Elementos.Count - 1; i++)
            {
                Console.WriteLine("Valores de los discos en la pila ini[" + i + "]: " + ini.Elementos[i].Valor);
            }
            Console.WriteLine();
            Console.WriteLine("Número de discos en las pilas => INI: " + ini.Size + " AUX: " + aux.Size + " FIN: " + fin.Size);
            Console.WriteLine("TOP en las pilas => INI: " + ini.Top + " AUX: " + aux.Top + " FIN: " + fin.Top);
            Console.WriteLine();
            Console.WriteLine("EMPIEZA EL JUEGO");

            if (n % 2 != 0)
            {
                while (fin.Size != n)
                {
                    mover_disco(ini, fin); m++;
                    Console.WriteLine("________________________________________________________________________________");
                    Console.WriteLine("MOVIMIENTO Nº" + m + " REALIZADO: ");
                    Console.WriteLine("Número de discos en las pilas => INI: " + ini.Size + " AUX: " + aux.Size + " FIN: " + fin.Size);
                    Console.WriteLine("TOP en las pilas => INI: " + ini.Top + " AUX: " + aux.Top + " FIN: " + fin.Top);
                    if (fin.Size == n)
                    {
                        break;
                    }

                    mover_disco(ini, aux); m++;
                    Console.WriteLine("________________________________________________________________________________");
                    Console.WriteLine("MOVIMIENTO Nº" + m + " REALIZADO: ");
                    Console.WriteLine("Número de discos en las pilas => INI: " + ini.Size + " AUX: " + aux.Size + " FIN: " + fin.Size);
                    Console.WriteLine("TOP en las pilas => INI: " + ini.Top + " AUX: " + aux.Top + " FIN: " + fin.Top);
                    if (fin.Size == n)
                    {
                        break;
                    }

                    mover_disco(aux, fin); m++;
                    Console.WriteLine("________________________________________________________________________________");
                    Console.WriteLine("MOVIMIENTO Nº" + m + " REALIZADO: ");
                    Console.WriteLine("Número de discos en las pilas => INI: " + ini.Size + " AUX: " + aux.Size + " FIN: " + fin.Size);
                    Console.WriteLine("TOP en las pilas => INI: " + ini.Top + " AUX: " + aux.Top + " FIN: " + fin.Top);
                    if (fin.Size == n)
                    {
                        break;
                    }
                }
            }


            if (n % 2 == 0)
            {
                while (fin.Size != n)
                {
                    mover_disco(ini, aux); m++;
                    Console.WriteLine("________________________________________________________________________________");
                    Console.WriteLine("MOVIMIENTO Nº" + m + " REALIZADO: ");
                    Console.WriteLine("Número de discos en las pilas => INI: " + ini.Size + " AUX: " + aux.Size + " FIN: " + fin.Size);
                    Console.WriteLine("TOP en las pilas => INI: " + ini.Top + " AUX: " + aux.Top + " FIN: " + fin.Top);
                    if (fin.Size == n)
                    {
                        break;
                    }

                    mover_disco(ini, fin); m++;
                    Console.WriteLine("________________________________________________________________________________");
                    Console.WriteLine("MOVIMIENTO Nº" + m + " REALIZADO: ");
                    Console.WriteLine("Número de discos en las pilas => INI: " + ini.Size + " AUX: " + aux.Size + " FIN: " + fin.Size);
                    Console.WriteLine("TOP en las pilas => INI: " + ini.Top + " AUX: " + aux.Top + " FIN: " + fin.Top);
                    if (fin.Size == n)
                    {
                        break;
                    }

                    mover_disco(aux, fin); m++;
                    Console.WriteLine("________________________________________________________________________________");
                    Console.WriteLine("MOVIMIENTO Nº" + m + " REALIZADO: ");
                    Console.WriteLine("Número de discos en las pilas => INI: " + ini.Size + " AUX: " + aux.Size + " FIN: " + fin.Size);
                    Console.WriteLine("TOP en las pilas => INI: " + ini.Top + " AUX: " + aux.Top + " FIN: " + fin.Top);
                    if (fin.Size == n)
                    {
                        break;
                    }
                }
            }
            Console.WriteLine("________________________________________________________________________________");
            return(m);
        }
예제 #27
0
 public int iterativo(int n, Pila ini, Pila fin, Pila aux)
 {
     if (n % 2 == 1 || n == 1)
     {
         while (fin.Size < n)
         {
             mover_disco(ini, fin);
             if (direccion == 2)
             {
                 Console.WriteLine("Moviendo de inicio a fin");
             }
             else
             {
                 Console.WriteLine("Moviendo de fin a inicio");
             }
             if (fin.Size == n)
             {
                 return(m);
             }
             mover_disco(ini, aux);
             if (direccion == 2)
             {
                 Console.WriteLine("Moviendo de inicio a aux");
             }
             else
             {
                 Console.WriteLine("Moviendo de aux a inicio");
             }
             mover_disco(aux, fin);
             if (direccion == 2)
             {
                 Console.WriteLine("Moviendo de aux a fin");
             }
             else
             {
                 Console.WriteLine("Moviendo de fin a aux");
             }
             if (fin.Size == n)
             {
                 return(m);
             }
         }
     }
     else
     {
         while (fin.Size < n)
         {
             mover_disco(ini, aux);
             if (direccion == 2)
             {
                 Console.WriteLine("Moviendo de inicio a aux");
             }
             else
             {
                 Console.WriteLine("Moviendo de aux a inicio");
             }
             mover_disco(ini, fin);
             if (direccion == 2)
             {
                 Console.WriteLine("Moviendo de inicio a fin");
             }
             else
             {
                 Console.WriteLine("Moviendo de fin a inicio");
             }
             if (fin.Size == n)
             {
                 return(m);
             }
             mover_disco(aux, fin);
             if (direccion == 2)
             {
                 Console.WriteLine("Moviendo de aux a fin");
             }
             else
             {
                 Console.WriteLine("Moviendo de fin a aux");
             }
             if (fin.Size == n)
             {
                 return(m);
             }
         }
     }
     return(0);
 }
예제 #28
0
 /*TODO: Implementar métodos*/
 public void mover_disco(Pila a, Pila b)
 {
 }
예제 #29
0
        static void Main(string[] args)
        {
            int t;

            Pila ini = new Pila();
            Pila aux = new Pila();
            Pila fin = new Pila();

            Console.WriteLine("==▒▓ Este es el juego de las Torres de Hanoi ▓▒==");
            Console.WriteLine("");

            Console.WriteLine("    ┌┐        ╔╗        ┌┐");
            Console.WriteLine("   ▓▓▓▓       ║║        ││");
            Console.WriteLine("  ▓▓▓▓▓▓      ║║        ││");
            Console.WriteLine(" ▓▓▓▓▓▓▓▓     ║║        ││");
            Console.WriteLine("██████████    ║║        ││");
            Console.WriteLine("────┴┴────────╨╨────────┴┴────");
            Console.WriteLine("   INI        AUX       FIN");

            Console.WriteLine("");
            Console.WriteLine("Indica el número de discos...");
            string key = Console.ReadLine();

            while (!Int32.TryParse(key, out t))
            {
                Console.WriteLine("");
                Console.WriteLine("Introduce un número valido...");
                key = Console.ReadLine();
            }

            while (Int32.Parse(key) < 0)
            {
                Console.WriteLine("No puedes jugar con discos negativos");
                Console.WriteLine("");
                Console.WriteLine("Introduce un número valido...");
                key = Console.ReadLine();
            }

            if (key != "0")
            {
                Console.WriteLine("");
                Console.WriteLine("Has elegido " + key + " discos.");

                Pila INI = new Pila(Int32.Parse(key));
                ini = INI;


                Hanoi hanoi = new Hanoi();

                Console.WriteLine("");
                Console.WriteLine("Pulsa (I) para Iterativo, pulsa (R) para Recursivo...");
                string key2 = Console.ReadLine();
                key2 = key2.ToUpper();
                while (key2 != "I" && key2 != "R")
                {
                    Console.WriteLine("");
                    Console.WriteLine("Valor no reconocido, introduce (I) o (R)...");
                    key2 = Console.ReadLine();
                    key2 = key2.ToUpper();
                }
                switch (key2)
                {
                case "I":
                    int c = hanoi.iterativo(Int32.Parse(key), ini, fin, aux);
                    Console.WriteLine("");
                    Console.WriteLine("Se ha completado en " + c + " movimientos");
                    break;

                case "R":
                    int d = hanoi.recursivo(Int32.Parse(key), ini, fin, aux);
                    Console.WriteLine("");
                    Console.WriteLine("Se ha completado en " + d + " movimientos");
                    break;
                }
            }
            else
            {
                Console.WriteLine("No se puede jugar con 0 discos");
            }

            Console.WriteLine("Press any key to exit.");
            Console.ReadKey();
        }