You are on page 1of 6

UNIVERSIDAD JOSE CARLOS MARIATEGUI SUB SEDE ILO CURSO:

FACULTAD DE INGENIERIA DE SISTEMAS E INFORMATICA INTELIGENCIA ARTIFICIAL I


Torres de Hani
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.












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
Mover (n-1) discos de A a B
(intC)
Mover (n-2) discos de A a C (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)
UNIVERSIDAD JOSE CARLOS MARIATEGUI SUB SEDE ILO CURSO:
FACULTAD DE INGENIERIA DE SISTEMAS E INFORMATICA INTELIGENCIA ARTIFICIAL I
El diagrama de Flujo del algoritmo(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


UNIVERSIDAD JOSE CARLOS MARIATEGUI SUB SEDE ILO CURSO:
FACULTAD DE INGENIERIA DE SISTEMAS E INFORMATICA INTELIGENCIA ARTIFICIAL I
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:




UNIVERSIDAD JOSE CARLOS MARIATEGUI SUB SEDE ILO CURSO:
FACULTAD DE INGENIERIA DE SISTEMAS E INFORMATICA INTELIGENCIA ARTIFICIAL I
Lo implementamos en Java con la aplicacin eclipse:
packagehanoi;
/**Programa para resolver el problema de las torres de Hanoi
* @authorNessy*/
publicclass 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
*/
staticpublicchartorreDisponible(charorigen,char destino){
char auxiliar;
if((origen !='A')&& (destino!='A')){
auxiliar='A';
}elseif ((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*/
staticpublicvoidresolverHanoi(intn,charorigen,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);
}
}
publicstaticvoid 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');
}
}

UNIVERSIDAD JOSE CARLOS MARIATEGUI SUB SEDE ILO CURSO:
FACULTAD DE INGENIERIA DE SISTEMAS E INFORMATICA INTELIGENCIA ARTIFICIAL I
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:
packagehanoi;
/**Programa para resolver el problema de las torres de Hanoi
* @authorNessy */
publicclass Hanoi {
staticintmovimientos=0;
/**Este mtodo permite determinar qu torre se puede utilizar
como auxiliar para los movimientos intermedios dadas unas torres de
orgen y destinocualquiera
* @param origen Torre de origen de los discos.
* @param destino Torre de destino de los discos
* @param auxiliar Torre auxiliar de los discos */
staticpublicchartorreDisponible(charorigen,char destino){
char auxiliar;
if((origen !='A')&& (destino!='A')){
auxiliar='A';
}elseif ((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.*/
staticpublicvoidresolverHanoi(intn,charorigen,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++;
}
}
publicstaticvoid 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 ");
}
}


UNIVERSIDAD JOSE CARLOS MARIATEGUI SUB SEDE ILO CURSO:
FACULTAD DE INGENIERIA DE SISTEMAS E INFORMATICA INTELIGENCIA ARTIFICIAL I
En la implementacin en C++ SERIA:
#include<iostream>

usingnamespacestd;

/* funcionhanoi: n = numero de discos, in = inicio, aux = medio, dest = final */
inthanoi(int n, char in, charaux, chardest)
{
/* si no hay discos retorna 0*/
if (n == 0) return 0;
else {
// se mueven n - 1 discos desde origen a auxiliar (medio)
// se considera a aux como destino
hanoi(n - 1, in, dest, aux);
// imprime movimiento
cout<< "Mover disco " << n << " desde " << in << " a " <<dest<<endl;
// se mueven n - 1 discos desde auxiliar a destino
// se considera a aux como inicio
hanoi(n - 1, aux, in, dest);
}
}

intmain()
{
/* I = inicio, A = auxiliar (medio), D = destino */
hanoi(6, 'I', 'A', 'D');

cin.get();
return 0;
}

/* Esta implementacin calcula los movimientos para 6 discos. Puedes cambiar el nmero de
discos en el llamado a la funcin hanoi(). */

You might also like