Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: m@o_614 en 27 Noviembre 2013, 21:02 pm



Título: Caballos
Publicado por: m@o_614 en 27 Noviembre 2013, 21:02 pm
Saludos, tengo un programa que dado un tamaño n de un tablero, me diga cual es el numero maximo de caballos que se pueden colocar en ese tablero sin atacarse? y de cuantas formas, el programa me tiene que dar maximo 10 soluciones solamente.

e hice un codigo que me pida una (x,y) aleatoria para poner en esa casilla al caballo y despues calcular los 8 movimientos posibles y asegurarme que no haya otra pieza en ninguna de esas 8 casillas que marque, para que no se ataquen,en caso de que si haya otro caballo que pueda atacar pedir otra (x,y) aleatoria, y asi sucesivamente hasta que tengo el total de caballos en el tablero, como son 10 tableros maximo, a cada uno le saco el numero total de caballos y esos totales los almaceno en un arreglo para despues buscar con una funcion el mayor de ellos. y ese seria mi maximo. Pero el problema es que ese no es el maximo, porque solo son 10 tableros, pero por ejemplo si fueran 20 tableros a los que les calculo su total de caballos puede ser que en alguno de esos haya un numero de caballos mayor que al mayor que calcule de los 10 tableros que tenia

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <time.h>
  5. #define NO_CASILLAS_DISPONIBLES 0
  6. #define MAX_SOLUCIONES 10
  7.  
  8. void inicializarTablero(char **tablero,int n);
  9. int insertarCaballos(char **tablero,int fila,int columna,int casillasDisponibles,int numCaballos,int n);
  10. int verificarMovimientos(char **tablero,int fila,int columna,int casillasDisponibles,int n);
  11. void imprimirTablero(char **tablero,int n);
  12. int maximoCaballos(int totalCaballos[]);
  13.  
  14. int main()
  15. {
  16.    FILE *fd;
  17.    int n,i,j = 0,fila,columna,numCaballos,totalCaballos[MAX_SOLUCIONES],casillasDisponibles,MaxCaballos;
  18.    char **tablero;
  19.    do
  20.    {
  21.        printf("Dame tamanio de tablero: ");
  22.        scanf("%d",&n);
  23.    }while(n < 2 || n > 20);/*
  24.     if((fd = fopen("caballos_xx.txt","w"))!=NULL)
  25.     {*/
  26.        srand(time(NULL));
  27.        tablero = malloc(n*sizeof(char*));
  28.        for(i = 0;i < n;i++)
  29.           tablero[i] = malloc(n);
  30.        while(j < MAX_SOLUCIONES)
  31.        {
  32.            numCaballos = 0;
  33.            casillasDisponibles = n*n;
  34.            fila = rand() % n;
  35.            columna = rand() % n;
  36.            printf("(%d,%d)\n",fila,columna);
  37.            inicializarTablero(tablero,n);
  38.            totalCaballos[j] = insertarCaballos(tablero,fila,columna,casillasDisponibles,numCaballos,n);
  39.            imprimirTablero(tablero,n);
  40.            printf("\n\nEl numero maximo de caballos en esta solucion es de %d\n",totalCaballos[j]);
  41.            j++;
  42.        }
  43.        MaxCaballos = maximoCaballos(totalCaballos);
  44.        printf("\nEl numero maximo de caballos en un tablero de %d x %d sin atacarse es %d\n",n,n,MaxCaballos);/*
  45.     }
  46.     else
  47.        printf("No se pudo crear archivo");*/
  48.    return 0;
  49. }
  50.  
  51. void inicializarTablero(char **tablero,int n)
  52. {
  53.    int i,j;
  54.    for(i = 0;i < n;i++)
  55.    {
  56.        for(j = 0;j < n;j++)
  57.           tablero[i][j] = '0';
  58.    }
  59. }
  60.  
  61. int insertarCaballos(char **tablero,int fila,int columna,int casillasDisponibles,int numCaballos,int n)
  62. {
  63.    if(casillasDisponibles > NO_CASILLAS_DISPONIBLES)
  64.    {
  65.        if(tablero[fila][columna] == '0')
  66.        {
  67.            tablero[fila][columna] = 'C';
  68.            casillasDisponibles = verificarMovimientos(tablero,fila,columna,casillasDisponibles,n);
  69.            numCaballos++;
  70.            fila = rand() % n;
  71.            columna = rand() %n;
  72.            insertarCaballos(tablero,fila,columna,casillasDisponibles,numCaballos,n);
  73.        }
  74.        else
  75.        {
  76.            fila = rand() % n;
  77.            columna = rand() %n;
  78.            insertarCaballos(tablero,fila,columna,casillasDisponibles,numCaballos,n);
  79.        }
  80.    }
  81.    else
  82.       return numCaballos;
  83. }
  84.  
  85. int verificarMovimientos(char **tablero,int fila,int columna,int casillasDisponibles,int n)
  86. {
  87.    int i,j,nuevaFila,nuevaColumna,eliminadas;
  88.    eliminadas = casillasDisponibles-1;
  89.    nuevaFila = fila + 2;
  90.    nuevaColumna = columna -1;
  91.    if((nuevaFila>=0&&nuevaFila<n)&&(nuevaColumna>=0&&nuevaColumna<n)&&(tablero[nuevaFila][nuevaColumna]=='0'))
  92.    {
  93.        tablero[nuevaFila][nuevaColumna] = 'x';
  94.        eliminadas--;
  95.    }
  96.    nuevaFila = fila + 2;
  97.    nuevaColumna = columna + 1;
  98.    if((nuevaFila>=0&&nuevaFila<n)&&(nuevaColumna>=0&&nuevaColumna<n)&&(tablero[nuevaFila][nuevaColumna]=='0'))
  99.    {
  100.        tablero[nuevaFila][nuevaColumna] = 'x';
  101.        eliminadas--;
  102.    }
  103.    nuevaFila = fila + 1;
  104.    nuevaColumna = columna - 2;
  105.    if((nuevaFila>=0&&nuevaFila<n)&&(nuevaColumna>=0&&nuevaColumna<n)&&(tablero[nuevaFila][nuevaColumna]=='0'))
  106.    {
  107.        tablero[nuevaFila][nuevaColumna] = 'x';
  108.        eliminadas--;
  109.    }
  110.    nuevaFila = fila + 1;
  111.    nuevaColumna = columna + 2;
  112.    if((nuevaFila>=0&&nuevaFila<n)&&(nuevaColumna>=0&&nuevaColumna<n)&&(tablero[nuevaFila][nuevaColumna]=='0'))
  113.    {
  114.        tablero[nuevaFila][nuevaColumna] = 'x';
  115.        eliminadas--;
  116.    }
  117.    nuevaFila = fila - 2;
  118.    nuevaColumna = columna - 1;
  119.    if((nuevaFila>=0&&nuevaFila<n)&&(nuevaColumna>=0&&nuevaColumna<n)&&(tablero[nuevaFila][nuevaColumna]=='0'))
  120.    {
  121.        tablero[nuevaFila][nuevaColumna] = 'x';
  122.        eliminadas--;
  123.    }
  124.    nuevaFila = fila - 2;
  125.    nuevaColumna = columna + 1;
  126.    if((nuevaFila>=0&&nuevaFila<n)&&(nuevaColumna>=0&&nuevaColumna<n)&&(tablero[nuevaFila][nuevaColumna]=='0'))
  127.    {
  128.        tablero[nuevaFila][nuevaColumna] = 'x';
  129.        eliminadas--;
  130.    }
  131.    nuevaFila = fila - 1;
  132.    nuevaColumna = columna - 2;
  133.    if((nuevaFila>=0&&nuevaFila<n)&&(nuevaColumna>=0&&nuevaColumna<n)&&(tablero[nuevaFila][nuevaColumna]=='0'))
  134.    {
  135.        tablero[nuevaFila][nuevaColumna] = 'x';
  136.        eliminadas--;
  137.    }
  138.    nuevaFila = fila - 1;
  139.    nuevaColumna = columna + 2;
  140.    if((nuevaFila>=0&&nuevaFila<n)&&(nuevaColumna>=0&&nuevaColumna<n)&&(tablero[nuevaFila][nuevaColumna]=='0'))
  141.    {
  142.        tablero[nuevaFila][nuevaColumna] = 'x';
  143.        eliminadas--;
  144.    }
  145.    return eliminadas;
  146. }
  147.  
  148. void imprimirTablero(char **tablero,int n)
  149. {
  150.     int i,j;
  151.     for(i = 0;i < n;i++)
  152.     {
  153.         printf("\n");
  154.         for(j = 0;j < n;j++)
  155.            printf("[%c]",tablero[i][j]);
  156.     }
  157.     printf("\n");
  158. }
  159.  
  160. int maximoCaballos(int totalCaballos[])
  161. {
  162.     int Maximo,i;
  163.     Maximo = totalCaballos[0];
  164.     for(i = 1;i < MAX_SOLUCIONES;i++)
  165.     {
  166.         if(totalCaballos[i] > Maximo)
  167.            Maximo = totalCaballos[i];
  168.     }
  169.     return Maximo;
  170. }
  171.  
  172.  

este es el codigo, pero no entiendo como puedo hacer que me saque el maximo posible sin necesidad de cambiar todo el codigo, me costo un poco de trabajo hacerlo y entender como iba a ser el algoritmo y todo, por eso no  quiero empezar desde 0, si pudieran ayudarme se los agradeceria muchisimo

de antemano gracias