Algoritmo - Implementación recursiva de la Torre de Hanoi

Tabla de contenido

introducción:

analizar:

Analiza el proceso de migración de las dos Torres de Hanoi:

 Analiza el proceso de migración de las tres Torres de Hanoi:

Código:

Salida recursiva:

Proceso recursivo: 

Código completo del programa:

resultado de la operación:

Referencias:


 

introducción:

Hoy entré en contacto con un juego muy interesante llamado Tower of Hanoi. Nunca jugué este juego de rompecabezas cuando era niño, así que hoy uso el código para realizar este juego de rompecabezas. Antes de escribir el código de la Torre de Hanoi, primero entendemos las reglas del juego, el modo de juego y el proceso del juego de la Torre de Hanoi:

La Torre de Hanoi, también conocida como la Torre de Hanoi , es un juguete educativo que se originó a partir de una antigua leyenda india . Cuando Brahma creó el mundo, hizo tres pilares de diamantes. En un pilar, se apilaron 64 discos de oro en orden de tamaño de abajo hacia arriba. Brahma le ordenó a Brahmin que reorganizara los discos en otro pilar en orden de tamaño desde abajo. Y se estipula que el disco no se puede agrandar en el disco pequeño, y solo se puede mover un disco entre los tres pilares a la vez.

analizar:

Analiza el proceso de migración de las dos Torres de Hanoi:

Supongamos que ahora tenemos dos hojas en el pilar A, marco cuadrado azul y marco inverso rojo, este es su estado inicial:

​​​​​​​cc54b2a5a80e43d2a7fdc56323a8d4bc.png 

Ahora vamos a migrar los cuadros rojo y azul del pilar A al pilar C de acuerdo con la regla original "el grande en la parte inferior y el pequeño en la parte superior". Obviamente, primero debemos migrar el cuadro azul al pilar B, y luego migrar el cuadro rojo al pilar C y luego migrar el cuadro azul del pilar B al pilar C completa la migración.

Suponiendo que migramos la caja superior del pilar cada vez, el orden de migración se puede expresar como:

A -> B

06411c7213d842228b36f61d043a5546.png

A -> C

38ac9c3eb0f64e4aa22c973f2862c6b7.png

B -> C

984690a71f6f4ad3bd71d6d34e58ea37.png

Hasta el momento, las dos torres de Hanoi han sido reubicadas.

 Analiza el proceso de migración de las tres Torres de Hanoi:

Supongamos que queremos migrar 3 Torres de Hanoi, que son cajas rojas, cajas azules y cajas amarillas, este es su estado inicial:

d1ec7b0d2039426491580c90b14a3985.png

Siguiendo las reglas del cuadro superior de cada pilar de migración anterior, la secuencia se puede expresar como:

A -> C

f2d051e44a9b4738ab529fd329129c7f.png

A -> B

49c7a31b83374813ad1ac649bc8aa60b.png

C -> B

02d14875725948798016d95945bc4a87.png

A -> C

e87ed5bfceff47249a779301c155b552.png

B -> A

c1a1a84b037549c18b012bc1ee609163.png

B -> C

14913f231af44029aa9f059e71c2c79e.png

A -> C 

bcd7bf9f8c32419c95b08c532ba08186.png

Hasta el momento, las tres Torres de Hanoi han sido reubicadas.

Entonces deberíamos pensar a continuación, ¿qué reglas podemos extraer de dos Torres de Hanoi a tres Torres de Hanoi? 

Descubrimos que, desde la perspectiva del proceso de migración de las tres Torres de Hanoi, lo que necesitamos primero es migrar las cajas de arriba de la parte inferior al pilar B, liberar y migrar la caja más grande de la parte inferior a la caja C, y luego mover el Las dos cajas superiores se colocan encima de la caja más grande a su vez. En otras palabras, no importa cuántas torres de Hanoi, podemos transformar un gran problema en un pequeño problema.

Por ejemplo, si quiero migrar cuatro piezas de la Torre de Hanoi, lo primero que debo considerar es cómo migrar correctamente las tres piezas por encima del marco inferior y migrar el marco inferior al pilar de destino;

Luego, cuando migre las tres Torres de Hanoi, lo que tengo que considerar es si migrar correctamente las dos piezas sobre el marco inferior y migrar el marco inferior al pilar de destino;

De manera similar, cuando migré dos Torres de Hanoi, por supuesto migré la superior al pilar B que no sea el pilar objetivo, luego moví el marco inferior al pilar objetivo y luego continué migrando el marco del pilar B a The El pilar C completa así todo el proceso de migración.

Podemos usar un dendrograma para simular el proceso de descomposición gradual del gran problema de las cuatro torres de Hanoi en tres y dos torres de Hanoi:

0e7aefc462b74728b73a44cea9370ef0.png

Nota: 2, 3 y 4 en el proceso de combinación aquí representan los cuadros inferiores correspondientes a cada paso. 

Código:

Después del análisis anterior del proceso de migración de la Torre de Hanoi, tenemos una idea clara de la idea general, y ahora implementamos recursivamente el código de la Torre de Hanoi:

En primer lugar, diseñemos una función recursiva. El problema de la Torre de Hanoi implica nada más que: las rebanadas de la Torre de Hanoi y los tres pilares (A, B y C), así que usamos estas dos cosas como la función Formal parámetros:

void Hanoi(int n, char A , char B , char C);

Salida recursiva:

Como queremos recursar, lo primero que debemos considerar es la salida recursiva, es decir, cuando el número de cortes en la torre a migrar es 1, migramos directamente esta pieza del pilar a migrar al pilar de destino, que se puede expresar en código que es:

if(n == 1){
        printf("%c -> %c\n",A,C);
    }

Proceso recursivo: 

Suponemos que hay n rebanadas de la Torre de Hanoi para migrar. De acuerdo con el proceso de descomposición y fusión analizado anteriormente, lo primero que debemos hacer es migrar todos los marcos superiores excepto el marco inferior al pilar B, que es decir, la transferencia n - 1 casilla pasa por alto el pilar C y migra al pilar B, expresado en código:

Hanoi(n - 1,'A','C','B');

Cuando hayamos migrado con éxito n - 1 cajas al pilar B, lo siguiente que debemos considerar es migrar la caja subyacente numerada n al pilar de destino (pilar C), es decir, A -> C, usando código para Eso significa:

printf("%c -> %c\n",'A','C');

Lo siguiente que debemos considerar es migrar las cajas del pilar B al pilar C a su vez, es decir migrar n - 1 piezas sin pasar por el pilar A al pilar C, expresado en código:

Hanoi(n - 1,'B','A','C');

Hasta ahora, se ha migrado la Torre de Hanoi con n cuadrados.

Código completo del programa:

#include<stdio.h>
void Hanoi(int n,char A,char B,char C)
{
    if(n == 1){
        printf("%c -> %c\n",A,C);
    }
    else{
        Hanoi(n - 1 , A,C,B);
        printf("%c -> %c\n",A,C);
        Hanoi(n - 1,B,A,C);
    }
}
int main()
{
    int n = 0;
    printf("Please enter the number of slice :");
    scanf("%d",&n);
    Hanoi(n,'A','B','C');
    return 0;
}

resultado de la operación:

Por ejemplo, aquí ingreso el número de cajas en la Torre de Hanoi como 3:

4b63ab275d3c4fcf99dd6cc7a244df30.png

El proceso de migración de los resultados de ejecución es exactamente el mismo que el proceso de migración de las tres Torres de Hanoi que analizamos anteriormente, y el resultado es correcto. 

Referencias:

Enciclopedia Baidu - Torre de Hanoi

 

Supongo que te gusta

Origin blog.csdn.net/weixin_45571585/article/details/126786782
Recomendado
Clasificación