es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo resolver el problema de Hanoi utilizando un método iterativo

Estoy tratando de resolver el problema de Hanoi utilizando un método iterativo.
Intento hacer esto utilizando dos bucles for anidados, para repetir n – 1 pasos en cada bucle, donde n es el número de movimientos. Creo que he planteado bien el problema utilizando dos for, pero no entiendo cómo cambiar el orden de las torres en cada paso.
¿Alguien puede ayudarme con esta tarea?

inizio es el inicio,
fine es el fin y
supp es el soporte

“`

#include <stdlib.h>

#include <stdio.h>

void torreOrganizador(int *inizio, int *fine, int *supp);
void hanoiIter(int n, int inizio, int fine, int supp);

int main(void){

int n;

printf(“%s\n” ,”inserisci un nuero positivo”);
scanf(“%d”, &n);

hanoi_Iter(n, 1, 2, 3);

return 0;

}

void hanoi_Iter(int n, int inizio, int fine, int supp){

for(int i = 1 ; i <= n ; i++){

for(int j = 1 ; j <= i - 1 ; j++){

    printf("%d -> %d\n", inizio, fine);
    torreOrganizador(&inizio, &fine, &supp);


}

printf("%d -> %d\n", inizio, fine);
torreOrganizador(&inizio, &fine, &supp);

}

}

void torreOrganizador(int *inizio, int *fine, int *supp){

static int count = 1;

int c = count % 6;

switch( c ){

case 0:
    *inizio = 1;
    *fine = 2;
    *supp = 3;
    break;
case 1:
    *inizio = 1;
    *fine = 3;
    *supp = 2;
    break;
case 2:
    *inizio = 2;
    *fine = 3;
    *supp = 1;
    break;
case 3:
    *inizio = 1;
    *fine = 2;
    *supp = 3;
    break;
case 4:
    *inizio = 3;
    *fine = 1;
    *supp = 2;
    break;
case 5:
    *inizio = 3;
    *fine = 2;
    *supp = 1;
    break;

}

count++;

} </stdio.h></stdlib.h>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el código proporcionado intenta resolver el problema de Hanoi de forma iterativa, pero con una implementación poco clara. El uso de dos bucles for para repetir n-1 pasos parece innecesario y potencialmente incorrecto. Además, la función tower_Organizer parece encargarse de cambiar el orden de las torres en cada pasada, pero utiliza una variable de recuento estática y una instrucción switch que tiene codificados los órdenes de las torres hasta seis pasos.

    Una forma alternativa de resolver el problema de Hanoi de forma iterativa es utilizando una estructura de datos stack (pila). Esto permite una implementación más intuitiva donde los discos se mueven constantemente de una torre a otra en función del estado de la pila. El seudocódigo para esta implementación sería algo así:

    inicializar tres pilas para cada torre
    para i desde n hasta 1 hacer:
        empujar el disco i a la pila de la torre de inicio
    mientras que la pila de la torre de destino no tenga todos los n discos hacer:
        si la iteración actual es impar:
            si hay un movimiento legal desde la torre de inicio a la torre de destino, sacar el disco superior de la torre de inicio y empujarlo a la torre de destino
            sino si hay un movimiento legal desde la torre de destino a la torre de inicio, sacar el disco superior de la torre de destino y empujarlo a la torre de inicio
        sino:
            si hay un movimiento legal desde la torre de inicio a la torre de soporte, sacar el disco superior de la torre de inicio y empujarlo a la torre de soporte
            sino si hay un movimiento legal desde la torre de soporte a la torre de inicio, sacar el disco superior de la torre de soporte y empujarlo a la torre de inicio
        si hay un movimiento legal desde la torre de soporte a la torre de destino, sacar el disco superior de la torre de soporte y empujarlo a la torre de destino
    

    Esta implementación sigue las reglas del problema de Hanoi asegurando que en cada paso solo se muevan discos más pequeños que el disco superior de la torre objetivo y alternando la dirección del movimiento en pasos impares y pares.

    Es importante tener en cuenta que para valores grandes de n, el número de iteraciones y movimientos podría volverse muy grande, lo que podría llevar a un desbordamiento de la pila o a tiempos de cómputo largos. En tales casos, podría ser más adecuada una implementación recursiva.

Comments are closed.