Ver Mensaje Individual
  #5 (permalink)  
Antiguo 28/05/2013, 13:26
Avatar de razpeitia
razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 9 meses
Puntos: 1360
Respuesta: [ansi c] torres de hanoi

Yo se regex.

Código C:
Ver original
  1. #define kMAX 30
  2. void g_MoverDiscos(int liFilas,int liNDiscos, int liTorreOrigen[kMAX],int liTorreDestino[kMAX])
  3. {
  4.     int liPosOrigen =0;
  5.     int liPosDestino=liFilas-1;
  6.  
  7.     //Busqueda de la posicio del menor disco en el origen
  8.     while(liTorreOrigen[liPosOrigen]==0 && liPosOrigen<liFilas-1)
  9.     {
  10.         liPosOrigen++;
  11.     }
  12.  
  13.     //Busqueda de la posicion del tope de la torre destino
  14.     while(liTorreDestino[liPosDestino]!=0 && liPosDestino>0)//Menor o igual
  15.     {
  16.         liPosDestino--;
  17.     }
  18.     liTorreDestino[liPosDestino]=liTorreOrigen[liPosOrigen];//Transferencia del disco
  19.     liTorreOrigen[liPosOrigen]=0;//Al moverse el disco esta posicion se hace cero.
  20. }
  21.  
  22.  
  23. void g_TorreDeHanoiRecursivo(int liFilas, int liNDiscos,int liTorreOrigen[kMAX], int liTorreIntermedia[kMAX],int liTorreDestino[kMAX])
  24. {
  25.  
  26.     if(liNDiscos==1)
  27.     {
  28.  
  29.     g_MoverDiscos(liFilas, liNDiscos, liTorreOrigen, liTorreDestino);
  30.     system("cls");
  31.     g_ImprimirDiscos(liFilas, liTorreOrigen,
  32.      liTorreIntermedia, liTorreDestino);
  33.      
  34.     }//END if
  35.     else
  36.     {
  37.         g_TorreDeHanoiRecursivo(liFilas, liNDiscos-1,liTorreOrigen, liTorreDestino,liTorreIntermedia);
  38.         g_MoverDiscos(liFilas, liNDiscos, liTorreOrigen, liTorreDestino);
  39.         system("cls");
  40.         g_ImprimirDiscos(liFilas, liTorreOrigen, liTorreDestino,liTorreIntermedia);
  41.  
  42.         g_TorreDeHanoiRecursivo(liFilas, liNDiscos-1, liTorreIntermedia, liTorreOrigen, liTorreDestino);
  43.     }//END else
  44. }//END g_TorreDeHanoiRecursivo
  45.  
  46. /// Esta es para leer los discos
  47. int giLeerDiscos(void)
  48. {
  49.     int liN;
  50.     do
  51.     {
  52.         printf("\nIndique la cantidad de discos: ");
  53.         scanf("%d",&liN);
  54.         if(liN<1||liN>kMAX_DISCOS)
  55.         {
  56.             system("cls");
  57.             printf("ERROR.OPCION NO ES VALIDA. VUELVA A INTENTAR\n\n");
  58.         }
  59.     }while(liN<1||liN>kMAX_DISCOS);
  60.     return liN;
  61. }
  62.  
  63.  
  64. //Funcion incializa los arreglos a la condicion *que deben tener antes de jugar
  65. void g_CondicionInicialHanoi(int liNDiscos,int liTorreOrigen[kMAX], int liTorreIntermedia[kMAX],int liTorreDestino[kMAX])
  66. {
  67.     int i;
  68.     for (i=0;i<liNDiscos;i++)
  69.     {
  70.         liTorreOrigen[i]=i+1; //Se colocan los discos desde el 1 en manera ascendente
  71.         liTorreIntermedia[i]=0; //Se hace cero
  72.         liTorreDestino[i]=0; //Se hace cero
  73.     }
  74. }
  75.  
  76.  
  77. void g_ImprimirDiscos(int liFilas,int liTorreOrigen[kMAX], int liTorreIntermedia[kMAX],int liTorreDestino[kMAX])
  78. {
  79.     int i;
  80.  
  81.     for (i=0;i<liFilas;i++)
  82.     {    
  83.         printf("%d\t",liTorreOrigen[i]);
  84.         printf("%d\t",liTorreIntermedia[i]);
  85.         printf("%d\t",liTorreDestino[i]);
  86.         printf("\n");
  87.     }
  88. }
  89.  
  90. int main()
  91. {
  92.     int liTorreOrigen[kMAX];
  93.     int liTorreIntermedia[kMAX];
  94.     int liTorreDestino[kMAX];
  95.     int liNDiscos;
  96.     int liFilas; // Es igual al numero inicial de discos. Define el espacio
  97.      // de juego.
  98.      
  99.      
  100.     liNDiscos=giLeerDiscos();
  101.     liFilas=liNDiscos;
  102.     //Condicion inicial del juego
  103.     g_CondicionInicialHanoi(liNDiscos,liTorreOrigen, liTorreIntermedia,liTorreDestino);
  104.      
  105.     //Imprimir condicion inicial del juego
  106.     system("cls");
  107.     g_ImprimirDiscos(liNDiscos,liTorreOrigen, liTorreIntermedia,liTorreDestino);
  108.     g_TorreDeHanoiRecursivo(liFilas, liNDiscos,liTorreOrigen,
  109.     liTorreIntermedia,liTorreDestino);
  110.     printf("\n");
  111.     return 0;
  112. }