Otras páginas de Rodolfo Valeiras
Heureka!

La Torre de Hanoi
(Continuación)

Saliéndose del camino

Hasta ahora nos hemos movido siempre dentro de la línea recta que une la posición inicial con la final, siguiendo una secuencia única de movimientos determinada desde el principio por el primer algoritmo. Pero las reglas del juego permiten otras posibilidades, por ejemplo, que haya discos juntos de la misma paridad. Es decir, hay muchos más movimientos y posiciones (o estados) que los vistos hasta ahora. Un estado queda definido por el poste donde está cada disco. Por ejemplo, en una torre de 3 discos, BCC sería el estado en el cual el disco 1 está en B, y los discos 2 y 3 están en C. Como en cada poste los discos están ordenados, esta información es suficiente.

Una Torre de Hanoi de tres discos en la posición descrita.
fig. 15

Hay en total 3n estados posibles y todos ellos son accesibles desde cualquier posición inicial. El conjunto de todos los estados y movimientos se puede representar mediante un grafo, donde los puntos representan los estados y las líneas, los movimientos (cada línea representa en realidad dos movimientos, uno en cada sentido). La más simple de las Torres de Hanoi, la de un solo disco, tiene este grafo.

El grafo de la Torre de un solo disco.
fig. 16

Hay tres estados: A, B y C. Para ir del estado inicial (A) al final (C) basta un movimiento, aunque si lo preferimos podemos dar un rodeo pasando por el estado B. He representado el estado inicial de color verde y el final de rojo; el camino más corto para ir del estado inicial al final, de azul y el más largo (que aparece al pasar el puntero del ratón por encima del grafo) de morado. He aquí el grafo de la Torre de 2 discos:

El grafo de la Torre de dos discos.
fig. 17

Como antes, hay un solo camino óptimo que conduce del estado inicial al final, así como un solo camino de longitud máxima (¿pésimo?) entre ambos estados. Este camino pasa por todos los estados sin repetir ninguno. Parece lógico preguntarse si esto ocurrirá siempre. A continuación se muestra el grafo de la Torre de tres discos. Está claro que el camino más corto, el que corresponde a los algoritmos que hemos visto, coincide siempre con el lado derecho del triángulo. Sin pasar el puntero del ratón sobre el gráfico, puedes intentar encontrar el camino más largo posible que va de AAA a CCC sin pasar por ningún punto dos veces.

El grafo de la Torre de tres discos.
fig. 18

El grafo de orden n se construye a partir del de orden n−1: el grafo de orden n está formado por tres grafos de orden n−1 conectados por tres líneas correspondientes a movimientos del disco n. Parece que fue Ian Stewart el primero que describió el grafo de la Torre de Hanoi de esta forma en su libro Another Fine Math You've Got Me Into (no traducido al español). A medida que aumenta el valor de n, el grafo se parece cada vez más a un conocido fractal llamado Triángulo de Sierpinski. A continuación podemos ver el grafo para n = 4, pero esta vez se han suprimido los puntos y las etiquetas, y en cambio las líneas son de distintos colores, cada uno correspondiente a un disco.

El grafo de la Torre de cuatro discos, usando distintos colores para los
movimientos de cada disco.
fig. 19

El camino más largo del grafo de orden n también se construye a partir del camino más largo del grafo de orden n−1. Fijándonos en la figura 18 (con el puntero encima para desvelar el camino largo), primero hay que ir de AAA a CCA, pasando por todos los puntos del triángulo superior (un grafo de orden 2); de CCA pasamos directamente a CCB, iniciando un viaje análogo al anterior que nos lleva hasta AAB; después de ir de AAB a AAC comienza la última parte del camino, también correspondiente a un grafo de orden 2. Está claro que es posible repetir este proceso a medida que n se hace mayor. A continuación se ilustra el caso n = 4, sin etiquetar los estados.

El grafo de la Torre de cuatro discos.
fig. 20

Por último vamos a ver el grafo para n = 5 (esta vez sin indicación del camino corto, que como siempre coincide con el lado de la derecha). El largo camino morado que aparece al pasar por encima el puntero (son 242 pasos) forma ya una figura bastante impresionante.

El grafo de la Torre de cinco discos.
fig. 21

¿Será posible diseñar un algoritmo que resuelva la Torre de Hanoi siguiendo este tortuoso camino? Después de ver en los dibujos cómo cada uno se basa en el de orden inferior podemos intuir que es posible definir también en este caso un algoritmo recursivo. Vamos a llamarlo «algoritmo pésimo».

Algoritmo pésimo para trasladar la torre 1...n del poste X al poste Z, usando como auxiliar el poste Y.

  1. Si n = 1, lleva el disco 1 primero de X a Y, y luego de Y a Z; fin.
  2. Traslada la torre 1...n−1 usando este mismo algoritmo, de X a Z, usando como auxiliar Y
  3. Lleva el disco n de X a Y.
  4. Traslada la torre 1...n−1 usando este mismo algoritmo, de Z a X, usando como auxiliar Y.
  5. Lleva el disco n de Y a Z.
  6. Traslada la torre 1...n−1 usando este mismo algoritmo, de X a Z, usando como auxiliar Y.

Animación que muestra la solución pésima de la Torre de tres discos.
fig. 22

¿Y qué hay de un algoritmo pésimo iterativo? Pues resulta que observando una de estas «soluciones pésimas» (ver la figura 22) se descubre un «comportamiento» de los discos enormemente regular, que nos sugiere con inesperada facilidad un algoritmo iterativo. La clave está otra vez en el disco pequeño, que ahora oscila continuamente por el puzzle, visitando los tres postes. El algoritmo es el siguiente.

  1. Mueve el disco 1 dos veces hacia la derecha, primero de A a B y luego de B a C.
  2. Si todos los discos están en C, fin. Si no, mueve otro disco cualquiera (sólo habrá una posibilidad).
  3. Mueve el disco 1 dos veces hacia la izquierda, primero de C a B y luego de B a A.
  4. Mueve un disco distinto de 1 (sólo habrá una posibilidad) y vuelve al primer paso.

Cambiando la posición inicial

Normalmente se presenta la Torre de Hanoi con una posición inicial fija, pero nada impide que, al modo de otros famosos rompecabezas, como el Juego del 15 o el Cubo de Rubik, partamos de una posición aleatoria. Es como si nos dejaran en un punto cualquiera del grafo y tuviéramos que llegar a la meta (que sigue estando abajo a la derecha) por el camino más corto. El grafo de orden 3 será suficiente para ilustrarlo. Encuentra el camino desde el punto verde hasta el rojo por el camino más corto.

El grafo de orden 3 con el punto final de siempre y un punto inicial cualquiera.
fig. 23

Aunque la solución es fácil, un giro de 60 grados hacia la derecha la hace parecer aún más obvia. Simplemente hay que «dejarse caer». En el siguiente dibujo, las líneas azules (una de ellas es la archiconocida solución desde la posición inicial típica) podrían representar corrientes de agua cayendo por una red de tuberías.

El mismo grafo de antes pero girado 60 grados hacia la derecha, mostrando
el camino desde varios puntos.
fig. 24

Esta forma de mirar el grafo nos ayuda también a agrupar las posiciones iniciales por distancias al objetivo. Todos los puntos que están a la misma altura están alejados de la posición final el mismo número de movimientos.

El mismo grafo de antes, indicando las distancias al estado final de cada
grupo horizontal de puntos.
fig. 25

La conocida distancia de 2n−1 es máxima, es decir, la posición inicial típica está a la máxima distancia posible de la final.

El siguiente algoritmo recursivo resuelve de forma óptima la Torre de Hanoi desde cualquier posición inicial. Llamaremos Z al poste de destino. En la última llamada n vale 0, en cuyo caso no hay que hacer nada (no se puede hacer nada con una torre de cero discos).

Algoritmo para formar la torre 1...n en el poste Z.

  1. Si n = 0, fin.
  2. Sea X el poste donde se encuentra el disco n. Si X = Z, forma la torre 1...n−1 (usando este mismo algoritmo) en Z y termina.
  3. Sea Y el poste que no es ni Z ni X. Forma la torre 1...n−1 en Y (usando este mismo algoritmo).
  4. Lleva el disco n de X a Z.
  5. Forma la torre 1...n−1 en Z (usando este mismo algoritmo, o bien otro de los vistos antes, puesto que la torre 1...n−1 ya está formada en Y).

Basándome en este algoritmo recursivo he podido encontrar uno iterativo bastante sencillo. Para explicarlo usaré una torre de cuatro discos en esta posición inicial.

Una Torre de Hanoi de cuatro discos en la posición BCAA.
fig. 26

El algoritmo se basa en una tabla con dos columnas y tantas filas como discos, poniendo más arriba los discos mayores.

Una tabla que ilustra el algoritmo explicado en el texto.
tabla 2

Vamos a completar la tabla por filas empezando por arriba. Cada vez que aparezcan una o varias palabras enmarcadas por una línea roja de puntos se puede pulsar con el ratón encima para actualizar la tabla. Si pulsamos sobre la tabla misma volverá a quedar en blanco.

La columna de la izquierda no ofrece ninguna duda: simplemente hay que poner la letra del poste donde se encuentra el disco cuyo número figura a la izquierda. Como el disco 4 está en el poste A en la primera casilla debemos poner una A. En la segunda casilla siempre debe ir una C. En las demás filas la columna «Va a...» se completa de la siguiente forma: si los dos valores de la fila anterior coinciden, se pone el mismo; si son distintos se pone la letra que falta. En este caso, por ejemplo, como tenemos en la primera fila A y C, hay que poner B. En la fila correspondiente al disco 2 hay que poner C en ambas columnas (porque el disco 2 está en el poste C y porque el poste distinto de A y B es C). El disco 1, por fin, se encuentra en B y va a C (mismo valor que el repetido en la fila anterior).

Una vez completada la tabla podemos hacer el primer movimiento, que corresponde a la primera fila, empezando por abajo, cuyas casillas son distintas. En este caso, el primer movimiento consiste en llevar el disco 1 del poste B al C. Después de hacer cada movimiento hay que actualizar la tabla a partir de la fila implicada en el movimiento. Como el movimiento era de la última fila (disco 1) sólo hay que cambiar ésta, poniendo el valor correcto para la columna «Está en...».

Ahora la primera fila (de abajo hacia arriba) con valores desiguales es la del disco 3, así que el segundo movimiento consiste el llevar el disco 3 del poste A al poste B. Pero esta vez la actualización de la tabla afecta a todas las filas a excepción de la primera. En el siguiente a movimiento vuelve a intervenir el disco 1.

Este proceso se repite hasta que todas las casillas de la tabla contienen una C.

Aunque este algoritmo es bastante adecuado para implementarlo en una computadora, ir escribiendo y borrando en un papel queda poco efectista cuando queremos impresionar a los amigos. Un algoritmo más apropiado para este fin se basa en las siguientes ideas, algunas ya familiares. La clave está en el tercer punto.

  1. En principio no sabemos si el primer movimiento lo debe realizar el disco 1 u otro, pero una vez determinado esto, al igual que ocurría en la solución clásica, se deben alternar movimientos con el disco 1 y con otro disco.
  2. Cuando le toca el turno a un disco distinto de 1, sólo hay un movimiento posible.
  3. Salvo si es el primer movimiento, el disco 1 debe desplazarse según el siguiente orden de preferencias.
    1. Sobre un disco par lo más pequeño posible.
    2. A un poste vacío.
    3. Sobre un disco impar lo más grande posible.

El punto 3 se puede expresar también diciendo que el disco 1 elige sus compañías de acuerdo con estos criterios:

Y el algoritmo sería:

  1. Determina el primer movimiento según el método explicado antes con la tabla.
  2. Si todos los discos están en el poste de destino, fin.
  3. Si el último movimiento ha sido con el disco 1, mueve un disco distinto (sólo hay una posibilidad). Si ha sido con otro disco, mueve el disco 1 según los criterios explicados antes. Vuelve al paso 2.

Determinar el primer movimiento sin tomar notas no es difícil, pero es de gran ayuda que los discos estén numerados. Para los demás movimientos es fundamental distinguir fácilmente los discos por su paridad (se impone una versión con dos colores).

Si, como se hace a veces, el puzzle se presenta sin un poste final fijo (se trata de formar la torre en cualquier poste; en el grafo equivale a encaminarse hacia el vértice más cercano) se puede usar el siguiente algoritmo (no óptimo), que aparece en la respuesta del archivo de rec.puzzles.

  1. Llama 1 al poste que contiene al disco más pequeño (disco 1).
  2. Llama 2 al poste que contiene el disco más pequeño que no está en el poste 1. Si este disco es k, los discos 1...k−1 están formando una torre en 1 y k está en la cima de 2.
  3. Lleva los discos 1...k−1 del poste 1 al poste 2 (usando cualquiera de los algoritmos conocidos para trasladar una torre completa).
  4. Si no están todos los discos correctamente colocados, vuelve al paso 1.

Cambiando la posición final

Después de haber resuelto el rompecabezas cambiando la posición inicial, ¿nos atrevemos a cambiar también la posición final? Realmente, un ligero cambio en el algoritmo de la tabla que vimos antes resuelve también este caso totalmente general. Basta tener en cuenta el destino de cada disco, que no será necesariamente el poste C. Al principio hay que poner en la segunda casilla el destino del disco n. Una vez colocado este disco habrá que poner el destino que le corresponda a n−1 en la cuarta casilla, etc.

Vamos a mostrarlo con el mismo ejemplo de antes, pero cambiando la posición final, que ahora será AACB. El siguiente dibujo alterna entre la posición inicial y la final si hacemos clic con el ratón sobre él.

Una Torre de Hanoi de cuatro discos alternando entre las posiciones BCAA y AACB.
fig. 27

Una tabla que ilustra el algoritmo explicado en el texto.
tabla 3

Son necesarios los siguientes once movimientos para ir del estado inicial al final. Al pulsar con el ratón sobre cada uno de ellos se actualiza tanto la tabla como el dibujo.

  1. B → A
  2. C → B
  3. A → B
  4. A → C
  5. B → A
  6. B → C
  7. A → C
  8. A → B
  9. C → B
  10. C → A
  11. B → A

Variantes

Sin duda mucho más aún puede hablarse y escribirse sobre este maravilloso invento de Édouard Lucas. Y si a su idea original le introducimos variaciones, la veta puede convertirse en prácticamente inagotable. La variante más obvia puede ser la adición de postes, lo que es conocido como puzzle de Reve. También hay variantes que usan varias torres de colores distintos. Y una versión perversa (en palabras de Martin Gardner) llamada Panex.

Algunos enlaces

La Torre de Hanoi es uno de los rompecabezas más populares y en Internet hay muchísimas referencias a él. He seleccionado sólo unas cuantos sitios entre los que me han parecido más interesantes o curiosos. En cualquiera de los tres primeros puedes practicar con el juego.

  1. http://hanoitower.mkolar.org/. Seguramente es el sitio más completo, con un simulador en JavaScript, varios algoritmos comentados y muchos enlaces.
  2. http://chemeng.p.lodz.pl/zylla/games/hanoi.html. Otra versión en JavaScript que además sabe resolver el juego desde una posición aleatoria.
  3. http://www.mazeworks.com/hanoi/. Un buen simulador en Java.
  4. http://www.cs.wm.edu/~pkstoc/toh.html. Este sitio incluye una imagen del dibujo de la caja original, otra de las instrucciones en francés (con poca resolución, cuesta trabajo leerlo) y su traducción al inglés y varios documentos (en formatos dvi y ps) incluyendo una bibliografía con aproximadamente 200 entradas.
  5. http://www.kernelthread.com/hanoi/. Una página con implementaciones en muchos lenguajes de programación.
  6. http://jpbrown.i8.com/hanoisolver.html. Página dedicada a un robot construido con piezas de Lego que resuelve el rompecabezas. El mismo autor ha creado otro robot (entre otros) que resuelve el cubo de Rubik.

Rodolfo Valeiras
Última modificación: 26 de julio de 2004

Código XHTML 1.0 validado