Está en la página 1de 8

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

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~
EJEMPLO
TORRES DE HANOI METODOLOGIA
JAVA ~4~
Para calcular la torre auxiliar, dadas un origen y destino cualquiera
sabemos que tenemos las siguientes posibilidades:

TORRES DE HANOI
DESTIN AUXILIA
ORIGEN
O R
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 ~5~
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 ~6~
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 ~7~
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 ~8~

También podría gustarte