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(). */