[Algoritmos] - Torres de Hanoi

Descripción general:

Un código (en VB.Net) minimalista que resuelve el algoritmo de las torres de Hanoi de forma recursiva

Las Torres de Hanói es un rompecabezas o juego matemático inventado en 1883 por el matemático francés Édouard Lucas. Este juego de mesa individual consiste en un número de discos perforados de radio creciente que se apilan insertándose en uno de los tres postes fijados a un tablero. El objetivo del juego es trasladar la pila a otro de los postes siguiendo ciertas reglas, como que no se puede colocar un disco más grande encima de un disco más pequeño. ( Fuente Wikipedia )


↑↑↑

Imágenes

Solución torres Hanoi con cuatro fichas

↑↑↑

El código en VB.Net

El código que resuelve este problema lo encontré hace muchos (pero muchos) años en una web francesa, lo he conservado, y ahora que es el momento, lo muestro a continuación.


Module Module1
    ' Esta es una variable global
    Dim movimientos As Integer
    Sub Main()
        Dim Nb As Integer
        Dim R As Char
        Console.WriteLine()
        Console.WriteLine("------------------------")
        Console.WriteLine("Aquí está la solución al famoso acertijo:")
        Console.WriteLine("(¡LAS TORRES DE HANOI!)")
        Console.WriteLine("------------------------")
        Do
            Console.Write("¿Cuántos discos desea resolver? :")
            Nb = CInt(Console.ReadLine())
            HanoiRecursiva(Nb, "A"c, "B"c, "C"c)
            Console.WriteLine("El número de movimientos es = " & movimientos)
            movimientos = 0
            Console.WriteLine("¿Le gustaría repetirlo otra vez?  s/n")
            '
            ' Aquí, si respondes algo, se repite el juego.
            ' pero si escribes no, se acaba el programa
            R = CChar(Console.ReadLine())
        Loop Until R = "n" Or R = "N"
    End Sub
    Private Sub HanoiRecursiva(
            ByVal N As Integer,
            ByVal A As Char,
            ByVal B As Char,
            ByVal C As Char)
        If N = 1 Then
            Console.WriteLine("Desplazar el disco  " & A & " =  =  = >> " & C)
            movimientos + = 1
        Else
            ' Todo el truco esta aquí
            HanoiRecursiva(N - 1, A, C, B)
            HanoiRecursiva(1, A, B, C)
            HanoiRecursiva(N - 1, B, A, C)
        End If
    End Sub
End Module


↑↑↑

Un ejemplo de la solución de este código


------------------------
Aquí está la solución al famoso acertijo:
(¡LAS TORRES DE HANOI!)
------------------------
¿Cuántos discos desea resolver? :4
Desplazar el disco  A ===>> B
Desplazar el disco  A ===>> C
Desplazar el disco  B ===>> C
Desplazar el disco  A ===>> B
Desplazar el disco  C ===>> A
Desplazar el disco  C ===>> B
Desplazar el disco  A ===>> B
Desplazar el disco  A ===>> C
Desplazar el disco  B ===>> C
Desplazar el disco  B ===>> A
Desplazar el disco  C ===>> A
Desplazar el disco  B ===>> C
Desplazar el disco  A ===>> B
Desplazar el disco  A ===>> C
Desplazar el disco  B ===>> C
El número de movimientos es = 15
¿Le gustaría repetirlo otra vez?  s/n