EJEMPLO TORRES DE HANOI
METODOLOGIA JAVA
~1~
EJEMPLO.Las Torres de Hanói
es un rompecabezas o juego matemático inventado en 1883 1883 por por el matemático francés Éduard Lucas. Lucas .[1] Este solitario se trata de un juego de ocho discos de radio creciente que se apilan insertándose i nsertándose en una de las tres estacas de un tablero. El objetivo del juego es crear la pila en otra de las l as estacas siguiendo unas ciertas ciertas reglas. El problema es muy conocido en la l a ciencia de la computación y aparece en muchos libros de texto como introducción a la teoría de algoritmos algoritmos..
Mover (n-2) discos de A a C (int C) Mover (n-1) discos de A a B
Mover disco (n-1) de A a B Mover disco (n-2) discos de C a B
Mover disco n de A a C
Mover (n-1) discos de B a C (intA)
Nos basamos en que sabemos resolver un problema de menor complejidad para resolver uno de mayor complejidad Mover N discos de origen a destino
Mover (N-1) discos de origen a auxiliar
Mover 1 disco origen a destino
Mover (N-1) disco de auxiliar a destino
EJEMPLO TORRES DE HANOI
METODOLOGIA JAVA
El diagrama de Flujo del algoritmo que vamos a llamar Hanoi(N,origen,destino)
El pseudocódigo de este algoritmo es el siguiente Hanoi (N, origen,destino) Si N >1 Auxiliar ← TorreLibre(origen,destino) Hanoi (N-1,origen,auxiliar) Print “mover 1 disco de origen a destino Hanoi(N-1,auxiliar,destino) En caso contrario Print “mover 1 disco de origen a destino”
~2~
EJEMPLO TORRES DE HANOI
METODOLOGIA
~3~
JAVA
Para calcular la torre auxiliar, dadas un origen y destino cualquiera sabemos que tenemos las siguientes posibilidades: TORRES DE HANOI ORIGEN
DESTINO
AUXILIAR
A
B
C
A
C
B
B
A
C
B
C
A
C
A
B
C
B
A
El diagrama de flujo para calcular la TorreLibre(origen,destino) es el siguiente:
EJEMPLO TORRES DE HANOI
METODOLOGIA JAVA
~4~
Lo implementamos en Java con la aplicación eclipse: package hanoi; /**Programa para resolver el problema de las torres de Hanoi * @author Nessy */ public class Hanoi { /**Este método permite determinar qué torre se puede utilizar como auxiliar * para los movimientos intermedios dadas unas torres de orígen y destino * cualquiera * @param origen Torre de origen de los discos. * @param destino Torre de destino de los discos * @param auxiliar Torre auxiliar de los discos */ static public char torreDisponible( char origen,char destino){ char auxiliar; if((origen !='A')&& (destino!='A')){ auxiliar='A'; }else if ((origen !='B')&& (destino!='B')){ auxiliar='B'; }else { auxiliar='C'; } return auxiliar; } /**Resolución del problema de las Torres de Hanoi para el caso de tener n discos y unas torres de origen y destino arbitrarias * @param n Número de discos a mover. * @param origen Torre donde están inicialmente los discos * @param destino Torre a la que mover los discos*/ static public void resolverHanoi( int n,char origen, char destino){ /**n es el número de discos a resolver*/ if(n>1){ char auxiliar = torreDisponible (origen,destino); resolverHanoi ((n-1),origen,auxiliar); System. out.println("Mover disco de " + origen + " a "+ destino); resolverHanoi ((n-1),auxiliar,destino);
}else { System. out.println("Mover disco de " + origen + " a "+ destino); } } public static void main(String[] args) { /*con esta línea compruebo que el método torreDisponible funciona correctamente * al enviarle las torres que tengo como origen y destino*/ //System.out.println(torreDisponible('A','B')); resolverHanoi (4,'A','C'); } }
EJEMPLO TORRES DE HANOI
METODOLOGIA JAVA
~5~
MEJORA Vamos a introducir los cambios necesarios en el programa (en el main) para poder enviarle el número de discos por consola: public static void main(String[] args) { /*con esta línea compruebo que el método torreDisponible funciona correctamente * al enviarle las torres que tengo como origen y destino*/ //System.out.println(torreDisponible('A','B')); resolverHanoi (Integer. parseInt(args[0]),'A','C'); }
en consola tendremos que llamarla del siguiente modo:
Dentro de la carpeta bin de nuestro proyecto (una vez que tenemos compilado nuestro proyecto (con run)) ponemos la llamada Java paquete.Clase argumentos En este caso para que ejecute 2 discos: Java hanoi.Hanoi 2
EJEMPLO TORRES DE HANOI
METODOLOGIA JAVA
~6~
MEJORA Vamos a introducir los cambios necesarios en el programa para que nos indique el número de movimientos realizados. De este modo queda el código como sigue: package hanoi; /**Programa para resolver el problema de las torres de Hanoi * @author Nessy */ public class Hanoi { static int movimientos=0; /**Este método permite determinar qué torre se puede utilizar como auxiliar para los movimientos intermedios dadas unas torres de orígen y destino cualquiera * @param origen Torre de origen de los discos. * @param destino Torre de destino de los discos * @param auxiliar Torre auxiliar de los discos */ static public char torreDisponible( char origen,char destino){ char auxiliar; if((origen !='A')&& (destino!='A')){ auxiliar='A'; }else if ((origen !='B')&& (destino!='B')){ auxiliar='B'; }else { auxiliar='C'; } return auxiliar; }
/** Resolución del problema de las Torres de Hanoi para el caso de tener n discos * y unas torres de origen y destino arbitrarias * @param n Número de discos a mover. * @param origen Torre donde están inicialmente los discos * @param destino Torre a la que mover los discos.*/ static public void resolverHanoi( int n,char origen, char destino){ /**n es el número de discos a resolver*/ if(n>1){ char auxiliar = torreDisponible (origen,destino); resolverHanoi ((n-1),origen,auxiliar); System. out.println("Mover disco de " + origen + " a "+ destino); resolverHanoi ((n-1),auxiliar,destino); movimientos ++; }else { System. out.println("Mover disco de " + origen + " a "+ destino); movimientos ++; } } public static void main(String[] args) { /*con esta línea compruebo que el método torreDisponible funciona correctamente * al enviarle las torres que tengo como origen y destino*/ //System.out.println(torreDisponible('A','B')); resolverHanoi (Integer. parseInt(args[0]),'A','C'); System. out.println("Se han realizado" + movimientos + " movimientos "); } }
EJEMPLO TORRES DE HANOI
METODOLOGIA JAVA
~7~
Mover disco de ORIGEN a AUXILIAR Mover disco de ORIGEN a DESTINO Mover disco de AUXILIAR a DESTINO En caso de tener 3 discos, es decir N=3 se deben hacer los siguientes movimientos: Mover disco de ORIGEN a DESTINO Mover disco de ORIGEN a AUXILIAR Mover disco de DESTINO a AUXILIAR Mover disco de ORIGEN a DESTINO Mover disco de AUXILIAR a ORIGEN Mover disco de AUXILIAR a DESTINO Mover disco de ORIGEN a DESTINO