2. Las Torres de Hanói es un rompecabezas o juego matemático
inventado en 1883 por el matemático francés Éduard Lucas.
Según una leyenda india, en el Templo de Benarés, bajo el domo que
marca el centro del mundo, hay una placa de latón con tres agujas de
diamante. Durante la creación, Dios puso sesenta y cuatro discos de
oro puro de distinto tamaño en una de las agujas, formando una torre.
3. Los bramanes llevan generaciones cambiando de lugar, uno a uno, los
discos de la torre entre las tres agujas de forma que en ningún momento un
disco mayor descanse sobre otro más pequeño. Cuando hayan
conseguido trasladar todos los discos a otra aguja su trabajo estará
terminado, y la torre y el templo se derrumbarán, y con un gran trueno, el
mundo se desvanecerá. La versión simplificada que se vendía en Francia
se componía de ocho discos de madera.
4. Declaración del problema.
Se deben mover todos los discos de una aguja a otra.
Sólo puede moverse un disco a la vez.
Ningún disco de tamaño mayor puede descansar sobre
uno de menor tamaño.
5. El algoritmo dependerá del número de discos del problema.
• Si inicialmente se tiene un número IMPAR de discos, el primer
movimiento es colocar el disco más pequeño en la pila destino, y en cada
paso impar se le mueve a la siguiente pila a su izquierda (o a la pila destino,
si está en la pila origen).
La secuencia será DESTINO, AUXILIAR, ORIGEN, DESTINO, AUXILIAR,
ORIGEN…
6. •Si se tiene inicialmente un número PAR de discos, el primer
movimiento debe ser colocar el disco más pequeño en la pila auxiliar, y en
cada paso impar se le mueve a la siguiente pila a su derecha (o a la pila
origen, si está en la pila destino).
La secuencia será AUXILIAR, DESTINO, ORIGEN,
AUXILIAR, DESTINO, ORIGEN,
7. Analizando otra vez el algoritmo recursivo y el razonamiento
que nos llevó a él podemos comprobar que (centrándonos en
el caso de 8 discos) el disco 8 se mueve una sola vez, el 7 dos
veces, el 6 cuatro veces, etc. El disco 1 se mueve 128 veces.
La suma de estas potencias de 2 coincide con el total de
movimientos antes calculado (1 + 2 + 4 + 8 + 16 + 32 + 64 +
128 = 255).
La cantidad de movimientos óptimos es dada por :
2N
-1
8. Es una técnica de
programación importante. Se
utiliza para realizar una
llamada a una función desde
la misma función.
9. #include <stdio.h>
#include <conio.h>
void hanoi(int n,int com, int aux, int fin);
void main(void){
clrscr();
char com='A';
char aux='B';
char fin='C';
int n;
printf("nNumero de discos: ");
scanf("%d",&n);
fflush(stdin);
printf("nnLos movimientos a realizar son:
n");
hanoi(n,com,aux,fin);
}
void hanoi(int n,int com, int aux, int fin){
if(n==1){
printf("%c->%c",com,fin);
}
else{
hanoi(n-1,com,fin,aux);
printf("n%c->%cn",com,fin);
hanoi(n-1,aux,com,fin);
getch();
return 0;
}
}