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); }
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; } } }
/* * 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); }