Você está na página 1de 7

EJEMPLO TORRES DE HANOI

METODOLOGIA JAVA

~1~

EJEMPLO .Las Torres de Hani es un rompecabezas o juego matemtico inventado en 1883 por el matemtico francs duard Lucas.[1] Este solitario se trata de un juego de ocho discos de radio creciente que se apilan insertndose en una de las tres estacas de un tablero. El objetivo del juego es crear la pila en otra de las estacas siguiendo unas ciertas reglas. El problema es muy conocido en la ciencia de la computacin y aparece en muchos libros de texto como introduccin a la teora de algoritmos.

Mover (n-2) discos de A a C (int C) Mover (n-1) discos de A a B (int C) 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

~2~

El diagrama de Flujo del algoritmo que vamos a llamar Hanoi(N,origen,destino)

El pseudocdigo 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

EJEMPLO TORRES DE HANOI

METODOLOGIA JAVA

~3~

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 aplicacin eclipse:


package hanoi; /**Programa para resolver el problema de las torres de Hanoi * @author Nessy */ public class Hanoi { /**Este mtodo permite determinar qu torre se puede utilizar como auxiliar * para los movimientos intermedios dadas unas torres de orgen 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; } /**Resolucin del problema de las Torres de Hanoi para el caso de tener n discos y unas torres de origen y destino arbitrarias * @param n Nmero de discos a mover. * @param origen Torre donde estn 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 nmero 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 lnea compruebo que el mtodo 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 nmero de discos por consola:
public static void main(String[] args) { /*con esta lnea compruebo que el mtodo 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 nmero de movimientos realizados. De este modo queda el cdigo como sigue:
package hanoi; /**Programa para resolver el problema de las torres de Hanoi * @author Nessy */ public class Hanoi { static int movimientos=0; /**Este mtodo permite determinar qu torre se puede utilizar como auxiliar para los movimientos intermedios dadas unas torres de orgen 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; } /** Resolucin del problema de las Torres de Hanoi para el caso de tener n discos * y unas torres de origen y destino arbitrarias * @param n Nmero de discos a mover. * @param origen Torre donde estn 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 nmero 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 lnea compruebo que el mtodo 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

Você também pode gostar