elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [ANSI C] Torre de hanoi
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [ANSI C] Torre de hanoi  (Leído 3,861 veces)
CrashNebula

Desconectado Desconectado

Mensajes: 3


Ver Perfil
[ANSI C] Torre de hanoi
« en: 26 Mayo 2013, 12:04 pm »

Estoy trabajando con las torres de hanoi. Quisiera que me ayudaran a descifrar
por qué mi código no funciona como debería. Debo hacerla mediante funciones
recursivas y no puedo utilizar métodos iterativos.

Las funciones donde probablemente tenga el error son la g_MoverDiscos o g_TorreDeHanoiRecursiva.

En mi programa utilicé 3 arreglos unidimensionales para la "torres".
Uno que se llama Origen que se imprime a la izquierda, otro que se
llama intermedio que se imprime en el centro y el final se llama destino.

Dados 3 discos este debería ser el output del programa

1  0  0      0  0  0     0  0  0     0  0  0     0  0  0    0  0  0    0  0  0   0  0  1         
2  0  0      2  0  0     0  0  0     0  1  0     0  1  0    0  0  0    0  0  2   0  0  2
3  0  0      3  0  1     3  2  1     3  2  0     0  2  3    1  2  3    1  0  3   0  0  3
Inicio       paso 1      paso 2   paso 3     paso 4    paso 5    paso 6    paso 7

Esto es lo que me está imprimiendo
1  0  0      0  0  0     0  0  0     0  0  0     0  0  0    0  0  0    0  0  0   0  0  1         
2  0  0      2  0  0     0  0  0     0  0  1     0  0  1    0  0  0    0  2  0   0  0  2
3  0  0      3  0  1     3  2  1     0  3  2     0  3  2    2  3  1    0  3  1   0  0  3
Inicio       paso 1      paso 2   paso 3     paso 4    paso 5    paso 6    paso 7
                                           Error1       Error2     Error3    Error4     Correcto

Mientras escribia esto note que los errores  parecen de impresion. :o.
Cualquier ayuda es útil muchas gracias.

Aqui debajo pondre las funciones donde creo que tengo el problema


Código:
#define kMAX 30
void g_MoverDiscos(int liFilas,int liNDiscos,
                   int liTorreOrigen[kMAX],int liTorreDestino[kMAX])
{
    int liPosOrigen =0;
    int liPosDestino=liFilas-1;

    //Busqueda de la posicio del menor disco en el origen
    while(liTorreOrigen[liPosOrigen]==0 && liPosOrigen<liFilas-1)
    {
        liPosOrigen++;
    }

    //Busqueda de la posicion del tope de la torre destino
    while(liTorreDestino[liPosDestino]!=0 && liPosDestino>0)//Menor o igual
    {
        liPosDestino--;
    }
    liTorreDestino[liPosDestino]=liTorreOrigen[liPosOrigen];//Transferencia del disco
    liTorreOrigen[liPosOrigen]=0;//Al moverse el disco esta posicion se hace cero.
}


void g_TorreDeHanoiRecursivo(int liFilas, int liNDiscos,int liTorreOrigen[kMAX],
                             int liTorreIntermedia[kMAX],int liTorreDestino[kMAX])
{

    if(liNDiscos==1)
    {

        g_MoverDiscos(liFilas, liNDiscos, liTorreOrigen, liTorreDestino);
        system("cls");
        g_ImprimirDiscos(liFilas, liTorreOrigen,
                         liTorreIntermedia, liTorreDestino);

    }//END if
    else
    {
        g_TorreDeHanoiRecursivo(liFilas, liNDiscos-1,liTorreOrigen,
                                liTorreDestino,liTorreIntermedia);

        g_MoverDiscos(liFilas, liNDiscos, liTorreOrigen, liTorreDestino);
        system("cls");
        g_ImprimirDiscos(liFilas, liTorreOrigen,
                          liTorreDestino,liTorreIntermedia);


        g_TorreDeHanoiRecursivo(liFilas, liNDiscos-1,liTorreIntermedia,
                                liTorreOrigen,liTorreDestino);
    }//END else
}//END g_TorreDeHanoiRecursivo



///
/// Estas son las demás funciones de mi programa (todas estas están bien)
///

Código:
/// Esta es para leer los discos
int giLeerDiscos(void)
{
    int liN;
    do
    {
        printf("\nIndique la cantidad de discos: ");
        scanf("%d",&liN);
        if(liN<1||liN>kMAX_DISCOS)
        {
            system("cls");
            printf("ERROR.OPCION NO ES VALIDA. VUELVA A INTENTAR\n\n");
        }
    }while(liN<1||liN>kMAX_DISCOS);
    return liN;
}


//Funcion incializa los arreglos a la condicion  que deben tener antes de jugar
void g_CondicionInicialHanoi(int liNDiscos,int liTorreOrigen[kMAX],
                             int liTorreIntermedia[kMAX],int liTorreDestino[kMAX])
{
    int i;
    for (i=0;i<liNDiscos;i++)
    {
        liTorreOrigen[i]=i+1;       //Se colocan los discos desde el 1 en manera ascendente
        liTorreIntermedia[i]=0;     //Se hace cero
        liTorreDestino[i]=0;        //Se hace cero
    }
}


void g_ImprimirDiscos(int liFilas,int liTorreOrigen[kMAX],
                        int liTorreIntermedia[kMAX],int liTorreDestino[kMAX])
{
    int i;

    for (i=0;i<liFilas;i++)
    {

        printf("%d\t",liTorreOrigen[i]);
        printf("%d\t",liTorreIntermedia[i]);
        printf("%d\t",liTorreDestino[i]);
        printf("\n");
    }
}

int  main()
{
    int liTorreOrigen[kMAX];
    int liTorreIntermedia[kMAX];
    int liTorreDestino[kMAX];
    int liNDiscos;
    int liFilas; // Es igual al numero inicial de discos. Define el espacio
                 // de juego.


    liNDiscos=giLeerDiscos();
    liFilas=liNDiscos;
    //Condicion inicial del juego
    g_CondicionInicialHanoi(liNDiscos,liTorreOrigen,
                            liTorreIntermedia,liTorreDestino);

    //Imprimir condicion inicial del juego
    system("cls");
    g_ImprimirDiscos(liNDiscos,liTorreOrigen,
                     liTorreIntermedia,liTorreDestino);
    g_TorreDeHanoiRecursivo(liFilas, liNDiscos,liTorreOrigen,
                            liTorreIntermedia,liTorreDestino);
    printf("\n");
return 0;
}






En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: [ANSI C] Torre de hanoi
« Respuesta #1 en: 26 Mayo 2013, 13:40 pm »

Si es recursivo no hay que hacer tanto.

El algoritmo para mover torres de un poste A a un poste C es el siguiente:

Citar
si discos == 1

  Mover disco A to C

sino

  Mover todos los discos salvo el grande (n-1) al poste B
  Mover el disco A al poste C
  Mover el resto de los discos de B a C

Simplementa hay que implementarlo al pie de la letra:

Código
  1. void Mover(char Inicial,char Auxiliar,char Destino,int N)
  2. {
  3.   if (N == 1)
  4.       printf ("Moviendo disco %c al poste %c",Inicial,Destino);
  5.   else
  6.  {
  7.     Mover(Inicial,Destino,Auxiliar,n-1); // Mover todos los discos -1 al auxiliar
  8.     printf("Moviendo disco %c al poste %c",Inicial,Destino); // Moviendo el grande al final
  9.    Mover(Auxiliar,Destino,Inicial,n-1); // Moviendo los discos desde el auxiliar al final
  10.  }
  11. }
  12.  

Ponle de nombre a los postes A,B,C y haz la prueba.


« Última modificación: 26 Mayo 2013, 13:42 pm por amchacon » En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
CrashNebula

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: [ANSI C] Torre de hanoi
« Respuesta #2 en: 26 Mayo 2013, 18:30 pm »

Si es recursivo no hay que hacer tanto.

El algoritmo para mover torres de un poste A a un poste C es el siguiente:

Simplementa hay que implementarlo al pie de la letra:

Código
  1. void Mover(char Inicial,char Auxiliar,char Destino,int N)
  2. {
  3.   if (N == 1)
  4.       printf ("Moviendo disco %c al poste %c",Inicial,Destino);
  5.   else
  6.  {
  7.     Mover(Inicial,Destino,Auxiliar,n-1); // Mover todos los discos -1 al auxiliar
  8.     printf("Moviendo disco %c al poste %c",Inicial,Destino); // Moviendo el grande al final
  9.    Mover(Auxiliar,Destino,Inicial,n-1); // Moviendo los discos desde el auxiliar al final
  10.  }
  11. }
  12.  

Ponle de nombre a los postes A,B,C y haz la prueba.


Se me olvido especificar que la version que debo hacer es la que presenta los
 movimientos de los discos y no la narrada.
Lo que quiero decir es que la version que tengo  es un paso previo a esto:


« Última modificación: 26 Mayo 2013, 18:32 pm por CrashNebula » En línea

CrashNebula

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: [ANSI C] Torre de hanoi
« Respuesta #3 en: 28 Mayo 2013, 17:43 pm »

bump
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Torres de hanoi
.NET (C#, VB.NET, ASP)
S1dD3xt35 0 3,532 Último mensaje 21 Marzo 2010, 01:20 am
por S1dD3xt35
torres de hanoi
Programación General
resckate 3 5,776 Último mensaje 10 Septiembre 2011, 22:01 pm
por Valkyr
Torres de Hanoi
Programación C/C++
m@o_614 4 3,940 Último mensaje 21 Diciembre 2011, 06:02 am
por naderST
Torre Hanoi mostrar numero de movimientos en C « 1 2 »
Programación C/C++
EmmanuelTR9 15 5,271 Último mensaje 1 Octubre 2019, 04:52 am
por EmmanuelTR9
Torre de Hanoi
Programación C/C++
michfere43 1 2,606 Último mensaje 29 Octubre 2020, 01:33 am
por K-YreX
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines