Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Marco_ant en 13 Mayo 2014, 07:23 am



Título: Necesito ayuda ¡¡ Desplazamineto del caballo
Publicado por: Marco_ant en 13 Mayo 2014, 07:23 am
Hola a todos tengo una duda con este codigo( lenguaje c ), es de el movimiento del caballo de ajedrez, se supone que tiene que tiene que abarcar todos lo cuadros del tablero sin pasar por uno mas de una vez, solo que me repite números en el tablero, ayuda por favor

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define ncuad n*n
  4. #define n 8
  5.  
  6.  
  7. void mover(int matriz1[][n],int i, int pos_x, int pos_y, int *q);
  8.  
  9. const int ejex[8] = { -1,-2,-2,-1, 1, 2, 2, 1 },
  10.          ejey[8] = { -2,-1, 1, 2, 2, 1,-1,-2 };
  11.  
  12. int main (void)
  13.  
  14. {
  15.  
  16.  
  17.  
  18.    int matriz1[n][n],i,j,q;
  19.  
  20.    for(i=0;i<n;i++)
  21.    {
  22.        for(j=0;j<n;j++)
  23.        {
  24.            matriz1[i][j]=0;
  25.        }
  26.    }
  27.  
  28.  
  29.    matriz1[0][0]=1;
  30.    mover(matriz1,2,0,0,&q);
  31.  
  32.    printf("\n\t");
  33.    printf("Estos son los valores de la matriz \n\n");
  34.    printf("\t\t MATRIZ ORDENADA ");
  35.    for(i=0;i<n;i++)
  36.    {
  37.        printf("\n");
  38.        for(j=0;j<n;j++)
  39.        {
  40.            printf("%6d", matriz1[i][j]);
  41.        }
  42.    }
  43.  
  44.    printf("\n");
  45.  
  46.  
  47.    return 0;
  48. }
  49. void mover(int matriz1[][n],int i, int pos_x, int pos_y, int *q)
  50. {
  51.  int k, u, v;
  52.  
  53.  k = 0;
  54.  *q = 0;
  55.  do {
  56.    u = pos_x + ejex[k]; v = pos_y + ejey[k]; /* seleccionar candidato */
  57.    if (u >= 0 && u < n && v >= 0 && v < n) { /* esta dentro de los limites? */
  58.      if (matriz1[u][v] == 0) {  /* es valido? */
  59.        matriz1[u][v] = i;  /* anota el candidato */
  60.        if (i < ncuad) {  /* llega al final del recorrido? */
  61.          mover(matriz1,i+1,u,v,q);
  62.        if (*q) matriz1[u][v] = 0; /* borra el candidato */
  63.        }
  64.        else *q = 1; /* hay solucion */
  65.      }
  66.    }
  67.    k++;
  68.  } while (!*q && k < 8);
  69. }
  70.  


[MOD] Para publicar codigo, usar etiquetas GeShi, gracias.


Título: Re: Necesito ayuda ¡¡ Desplazamineto del caballo
Publicado por: Randomize en 13 Mayo 2014, 13:40 pm
¡¡¡ Qué manía con poner los deberes por el foro !!!  :D :D :D


Yo también tengo deberes y no los pongo  ::)


Título: Re: Necesito ayuda ¡¡ Desplazamineto del caballo
Publicado por: eferion en 13 Mayo 2014, 16:10 pm
deberías repensar un poco el algoritmo.

Las constantes deberían ir en mayúsculas, ayuda a identificarlas dentro del código... sobretodo si le das nombres tan "currados" como "n".

Por otro lado, el parámetro "int *q" no es necesario para tu código. Puedes conseguir el mismo efecto haciendo que la función "mover" devuelva un entero para indicar si se ha encontrado una solución o no.

Luego, fíjate que tienes la línea

Código
  1. if (*q) matriz1[u][v] = 0; /* borra el candidato */

Es decir, si hay solución, entonces te cargas la solución encontrada?? ¿No debería ser al reves?

Aplicando los cambios a mí me funciona:

Código:

        Estos son los valores de la matriz

                 MATRIZ ORDENADA
     1     8    11    16     3    18    13    64
    10    27     2     7    12    15     4    19
    53    24     9    28    17     6    63    14
    26    39    52    23    62    29    20     5
    43    54    25    38    51    22    33    30
    40    57    42    61    32    35    48    21
    55    44    59    50    37    46    31    34
    58    41    56    45    60    49    36    47


Título: Re: Necesito ayuda ¡¡ Desplazamineto del caballo
Publicado por: Marco_ant en 16 Mayo 2014, 20:11 pm
Que cambios mencionas no te entiedo??


Título: Re: Necesito ayuda ¡¡ Desplazamineto del caballo
Publicado por: leosansan en 16 Mayo 2014, 20:49 pm
Código
  1. if (!*q) matriz1[u][v] = 0; /* borra el candidato */

¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


P.D: Tarda algo más de 30 segundos en encontrar la solución.

Citar
       Estos son los valores de la matriz


                 MATRIZ ORDENADA

      1     8    11    16      3    18    13   64
    10    27     2     7     12    15      4   19
    53    24      9   28    17      6    63   14
    26    39    52    23    62    29    20    5
    43    54    25    38    51    22    33   30
    40    57    42    61    32    35    48   21
    55    44    59    50    37    46    31   34
    58    41    56    45    60    49    36   47

Process returned 0 (0x0)   execution time : 32.015 s
Press any key to continue.