Пример #1
0
        public int recursivo(int n, Pila ini, Pila fin, Pila aux)
        {
            int movimientos = 0;

            if (n == 1)
            {
                mover_disco(ini, fin);
                movimientos++;
                Console.WriteLine(ini.ToString());
                Console.WriteLine(aux.ToString());
                Console.WriteLine(fin.ToString());
            }
            else
            {
                recursivo(n - 1, ini, aux, fin);
                mover_disco(ini, fin);
                movimientos++;
                Console.WriteLine(ini.ToString());
                Console.WriteLine(aux.ToString());
                Console.WriteLine(fin.ToString());

                recursivo(n - 1, aux, fin, ini);
            }


            return(movimientos);
        }
Пример #2
0
        static void Main(string[] args)
        {
            bool seguir = true;

            Console.WriteLine("EJERCICIO TORRES HANOI-------------------------------");

            while (seguir)
            {
                // leer el numero n de piezas
                Console.WriteLine("Introduzca numero de piezas: ");
                int n = Convert.ToInt32(Console.ReadLine());

                // crear las 3 pilas y el objeto hanoi
                Pila p1 = new Pila("INI");
                Pila p2 = new Pila("FIN");
                Pila p3 = new Pila("AUX");

                Hanoi h = new Hanoi();

                // añadir los n discos a la pila ini
                for (int i = n; i >= 1; i--)
                {
                    p1.push(new Disco(i));
                }

                Console.WriteLine(p1.ToString());
                Console.WriteLine(p3.ToString());
                Console.WriteLine(p2.ToString());

                Console.WriteLine("Se completo en: " + h.iterativo(p1.Elementos.Count, p1, p2, p3) + " movimientos");

                //Console.WriteLine("Se completo en: " + h.recursivo(p1.Elementos.Count, p1, p2, p3) + " movimientos");

                Console.WriteLine("El número mínimo de movimientos para " + n + " piezas es: " + (Math.Pow(2, n) - 1));

                Console.WriteLine("Pulsa 'q' para salir o cualquier otra para repetir");
                char c = Console.ReadLine()[0];
                if (c.Equals('q'))
                {
                    seguir = false;
                }
            }
        }
Пример #3
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);
        }