Ver Mensaje Individual
  #7 (permalink)  
Antiguo 12/05/2016, 02:23
aguml
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 9 meses
Puntos: 3
Respuesta: Saber todas las combinaciones posibles de un tablero

Bueno amigos, he encontrado este código en C que usa recursividad: http://elvex.ugr.es/decsai/c/problemas/reinas/reinas2.c
Estoy intentando pasarlo a no recursivo y me tiene loco porque no veo el modo de hacerlo. El caso es que, como dije, la recursividad y yo somos enemigos declarados y me pierdo cuando intento entender una funcion recursiva por muy sencilla que sea jajaja. Aqui está lo que llevo:
Código C:
Ver original
  1. // Problema de las N reinas
  2. // ------------------------
  3.  
  4. // Algoritmo recursivo
  5. //
  6. // 0. Obviamente, colocaremos una reina en cada fila
  7. //
  8. // 1. Se coloca una reina en una casilla de su fila y,
  9. //    a continuación, se intentan colocar las reinas restantes.
  10. //
  11. // 2. Si las demás reinas no se pueden colocar con éxito,
  12. //    probamos a colocar la reina actual en otra columna.
  13. //
  14. // Caso base: Cuando no quedan reinas por colocar.
  15.  
  16.  
  17. #include <stdio.h>
  18. #include <stdlib.h>
  19.  
  20. // Constantes simbólicas
  21.  
  22. #define TRUE  1
  23. #define FALSE 0
  24.  
  25.  
  26. // Comprobar si una reina está bien colocada
  27. // -----------------------------------------
  28. // La reina de la fila i está bien colocada si no está
  29. // en la columna ni en la misma diagonal que cualquiera
  30. // de las reinas de las filas anteriores
  31. //
  32. // Parámetros
  33. //   fila   - Fila de la reina cuya posición queremos validar
  34. //   reinas - Vector con las posiciones de las reinas
  35. //   n      - Número de reinas
  36.  
  37.  
  38. int comprobar (int fila, int reinas[], int n)
  39. {
  40.   int i;
  41.  
  42.   for (i=0; i<fila; i++)
  43.       if (  ( reinas[i]==reinas[fila] )                      // Misma columna
  44.          || ( abs(fila-i) == abs(reinas[fila]-reinas[i]) ) ) // Misma diagonal
  45.          return FALSE;
  46.  
  47.   return TRUE;
  48. }
  49.  
  50.  
  51. // Mostrar el tablero con las reinas
  52. // ---------------------------------
  53. // Parámetros:
  54. //   reinas - Vector con las posiciones de las distintas reinas
  55. //   n      - Número de reinas
  56.  
  57. void mostrarTablero (int reinas[], int n)
  58. {
  59.   int i,j;
  60.  
  61.   for (i=0; i<n; i++) {
  62.  
  63.       for (j=0; j<n; j++) {
  64.  
  65.           if (reinas[i]==j)
  66.              printf("#");
  67.           else
  68.              printf("-");
  69.       }
  70.  
  71.       printf(" %d %d\n",i,reinas[i]);
  72.   }
  73.  
  74.   printf("\n");
  75. }
  76.  
  77.  
  78. // Colocación de una reina
  79. // -----------------------
  80. // Parámetros
  81. //   fila   - Fila de la reina que queremos colocar
  82. //   reinas - Vector con las posiciones de las reinas
  83. //   n      - Número de reinas
  84.  
  85. int colocarReina (int fila, int reinas[], int n)
  86. {
  87.   int ok = FALSE;
  88.  
  89.   if (fila<n) {
  90.  
  91.      // Quedan reinas por colocar
  92.  
  93.          // Comprobamos si la posición
  94.          // de la reina actual es válida
  95.  
  96.          if (comprobar(fila,reinas,n)) {
  97.  
  98.             // Si es así, intentamos colocar
  99.             // las reinas restantes
  100.             ok = TRUE;
  101.          }
  102.  
  103.   } else {
  104.  
  105.      // No quedan reinas por colocar (solución)
  106.  
  107.      mostrarTablero(reinas,n);
  108.   }
  109.  
  110.   return ok;
  111. }
  112.  
  113.  
  114.  
  115. // Mostrar información acerca del uso del programa
  116. // -----------------------------------------------
  117. // Parámetro:
  118. //   programa - Nombre del programa
  119.  
  120. void mostrarAyuda (char *programa)
  121. {
  122.   printf("Instrucciones:\n");
  123.   printf("-------------\n\n");
  124.   printf("Al princicio nos pide el numero de reinas que deseamos colocar en el tablero.\n");
  125.   printf("El numero de reinas sera igual a las dimensiones del tablero, osea que\n");
  126.   printf("el tablero tendra un tamaño de nReinas x nReinas.\n");
  127.   printf("El valor minimo permitido es 4 y el maximo es 10.\n");
  128. }
  129.  
  130. // Programa principal
  131. // ------------------
  132.  
  133. int main (int argc, char *argv[])
  134. {
  135.   int *reinas;  // Vector con las posiciones de las reinas de cada fila
  136.   int nreinas;  // Número de reinas
  137.   int i;        // Contador
  138.   int fila;
  139.   int nposibles,probados=0;
  140.  
  141.   // Obtener el número de reinas
  142.   printf("Introduce el numero de reinas: ");
  143.   scanf("%d",&nreinas);
  144.  
  145.   if(nreinas >=4 && nreinas <=10){
  146.       // Colocar las reinas en el tablero
  147.  
  148.       // Crear vector dinámicamente
  149.       reinas = (int*) malloc ( nreinas*sizeof(int) );
  150.  
  151.       // Inicializar vector:
  152.       // (inicialmente, ninguna reina está colocada)
  153.       for (i=0; i<nreinas; i++)
  154.           reinas[i] = -1;
  155.  
  156.       //Obtener el numero de combinaciones posibles
  157.       for(i=1,nposibles=1;i<=nreinas;i++)
  158.          nposibles *= i;
  159.  
  160.       // Colocar reinas
  161.       do{
  162.          fila=0;
  163.          for (reinas[fila]=0; reinas[fila]<nreinas; reinas[fila]++) {
  164.             if(colocarReina(fila,reinas,nreinas) == TRUE){
  165.                fila++;
  166.             }else{
  167.                break;
  168.             }
  169.          }
  170.          probados++;
  171.       }while(nposibles > probados);
  172.  
  173.       // Liberar memoria
  174.       free (reinas);
  175.   } else {
  176.       mostrarAyuda(argv[0]);
  177.   }
  178.   return 0;
  179. }
¿Podriais echarme una mano diciendome que debo cambiar y sobre todo explicarme que hago mal?