• Miércoles 6 de Noviembre de 2024, 06:30

Autor Tema:  Re: TABLERO DE AJEDREZ  (Leído 10266 veces)

Juan Pablo

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re: TABLERO DE AJEDREZ
« en: Viernes 22 de Noviembre de 2002, 01:44 »
0
AYUDA!!!!!!!!!!!
NESECITO HACER UN PROGRAMA PARA TURBO C, SOBRE UN TABLERO DE AJEDREZ EN DONDE SE MUEVA EL CABALLO (MOVIMIENTO EN L) POR TODOS LOS CASILLEROS SIN PASAR POR EL MISMO CASILLERO.
SI NO ME AYUDAN ME ECHO EL RAMO....AYUDA!!!!!!!!!!!!!!:(

adocrates

  • Miembro activo
  • **
  • Mensajes: 54
    • Ver Perfil
Re: TABLERO DE AJEDREZ
« Respuesta #1 en: Viernes 22 de Noviembre de 2002, 16:06 »
0
Espero que te sirva...

 
Código: Text
  1. /*
  2. +-------------------+
  3. | SALTO DEL CABALLO |
  4. +-------------------+
  5.  
  6.         Este programa realiza lo siguiente:  Se da un tablero de nxn
  7. con n*n cuadros. Un caballo -que  puede moverse según las reglas del
  8. ajedrez-  se sitúa  en el   cuadro de  coordenadas (x0,y0).  Se pide
  9. encontrar, si existe, un recubrimiento  del tablero completo, o sea,
  10. calcular un circuito  de n*n-1 movimientos de forma  que cada cuadro
  11. del tablero sea visitado exactamente una vez.
  12.  
  13.         La  solución a  este problema  está basado  en el  método de
  14. tanteo sistemático (intento y error).
  15.  
  16.         La función más importante  es ensayar() cuyo pseudocódigo es
  17. el siguiente:
  18.  
  19.     <PRINCIPIO ensayar>
  20.       REPETIR seleccionar el nuevo candidato  de la lista de futuros
  21.       movimientos
  22.         SI aceptable ENTONCES
  23.           SI tablero no lleno ENTONCES
  24.             LLAMAR ensayar nuevo movimiento
  25.             SI no acertado ENTONCES
  26.               borrar la anotación anterior
  27.             FINSI
  28.           FINSI
  29.         FINSI
  30.       HASTA movimiento acertado O no hay más posibilidades
  31.     <FIN>
  32.  
  33.   Observaciones sobre el código:
  34.  
  35.     1) Estudiar la función ensayar() a partir de este pseudocódigo.
  36.  
  37.     2) El método utilizado para obtener el movimiento del caballo de
  38. (x1,y1)  hasta   (x2,y2)  es  sumar   a  (x1,y1)  los   vectores  de
  39. diferencias.
  40.  
  41.        Los  vectores  de  diferencia  dif_x  y  dif_y  contienen  la
  42. diferencia de la coordenada x  e y respectivamente desde la posición
  43. actual del caballo.
  44.  
  45.        Veáse con el siguiente tablero:
  46.  
  47.            0  6  0  7  0
  48.  
  49.            5  0  0  0  8
  50.  
  51.            0  0  C  0  0
  52.  
  53.            4  0  0  0  1
  54.  
  55.            0  3  0  2  0
  56.  
  57.        C representa la posición del caballo;  los números del 1 al 8
  58. respresentan  los 8  posibles movimientos.  El primer  movimiento se
  59. obtiene: x2 = x1 + 2; y2 = y1 + 1;
  60.  
  61.     3) La macro tab() se utiliza  para trabajar con los índices de 1
  62. a n en la  matriz del tablero en vez  de con los índices reales  0 a
  63. n-1.
  64.  
  65.     4) La condición ®tablero no lleno¯ se expresa mediante ®i < n*n¯
  66. donde  i  es  el  número  de  movimiento  del  caballo actual y n la
  67. dimensión del tablero.
  68.  
  69.     5)  El significado  de las  asignaciones a  los elementos  de la
  70. matriz es:
  71.  
  72.       tab (x, y) = 0; /* el cuadro <x,y> no ha sido visitado */
  73.       tab (x,  y) = i;  /* el  cuador  <x,y> ha sido  visitado en el
  74.                         movimiento i-ésimo (1 ó i ó n*n) */
  75.  
  76.   NOTA: Con  un dimensión de la  matriz superior a 4,  el proceso de
  77. encontrar la solución  es muy lento. Por eso se  ha puesto el límite
  78. en 8 aunque ya con este número el proceso es superlento (en términos
  79. de  media, ya  que puede  dar la  casualidad de  que se encuentre la
  80. solución en los primeros intentos).
  81. */
  82.  
  83. /* Ficheros a incluir: */
  84.  
  85. #include <stdio.h>  /* printf () */
  86. #include <conio.h>  /* getch () */
  87. #include <stdlib.h> /* exit () */
  88.  
  89. /* Macros: */
  90.  
  91. #define NUM_MOVIMIENTOS_POSIBLES 8
  92. #define NMAXIMO 8
  93.  
  94. #define BOOLEAN int
  95. #define TRUE    1
  96. #define FALSE   0
  97.  
  98. #define ESC 27
  99.  
  100. #define en(x,x1,x2) ((x) >= (x1) && (x) <= (x2))
  101.  
  102. #define tab(i,j) tablero[(i)-1][(j)-1]  /* tab(1,1) es en realidad
  103.                                         tablero[0][0] */
  104.  
  105. /* Variables globales: */
  106.  
  107. int n, tablero[NMAXIMO][NMAXIMO];
  108. BOOLEAN movimiento_acertado;
  109. int dif_x [NUM_MOVIMIENTOS_POSIBLES] =
  110.           { 2, 1, -1, -2, -2, -1, 1, 2 },
  111.     dif_y [NUM_MOVIMIENTOS_POSIBLES] =
  112.           { 1, 2, 2, 1, -1, -2, -2, -1 };
  113.  
  114. /* Prototipos de las funciones: */
  115.  
  116. void proceso (void);
  117. void ensayar (int i, int x, int y);
  118.  
  119. /* Definiciones de las funciones: */
  120.  
  121. void main (void)
  122. {
  123.   do
  124.     {
  125.       printf ("nnVUELTA DEL CABALLO:n  ");
  126.       proceso ();
  127.       printf ("nPulsa cualquier tecla para repetir "
  128.              "o ESC para salir. ");
  129.     } while (getch () != ESC);
  130. }
  131.  
  132. void proceso (void)
  133. {
  134.   register int i, j;
  135.   int x0, y0;
  136.  
  137.   for (i = 1; i <= n; i++)
  138.     for (j = 1; j <= n; j++)
  139.       tab (i, j) = 0;
  140.  
  141.   printf ("nIntroduce dimensión del tablero (1 ó n ó %d, n > 4 es "
  142.           "muy lento): ", NMAXIMO);
  143.   do
  144.     {
  145.       n = getch () - '0';
  146.     } while (! en (n, 1, NMAXIMO));
  147.   putch (n + '0');
  148.  
  149.   printf ("nFila inicial (1 ó x ó %d): ", n);
  150.   do
  151.     {
  152.       x0 = getch () - '0';
  153.     } while (! en (x0, 1, n));
  154.   putch (x0 + '0');
  155.  
  156.   printf ("nColumna inicial (1 ó y ó %d): ", n);
  157.   do
  158.     {
  159.       y0 = getch () - '0';
  160.     } while (! en (y0, 1, n));
  161.   putch (y0 + '0');
  162.  
  163.   tab (x0, y0) = 1;
  164.   printf ("nn");
  165.   ensayar (2, x0, y0);
  166.  
  167.   if (movimiento_acertado)
  168.     for (printf ("nnLA SOLUCION ES:n  "), i = 1; i <= n; i++)
  169.       {
  170.         for (j = 1; j <= n; j++)
  171.           printf ("%2d ", tab (i, j));
  172.         printf ("n  ");
  173.       }
  174.   else
  175.     printf ("nnNO HAY SOLUCION.n");
  176. }
  177.  
  178. void ensayar (int i, int x1, int y1)
  179. {
  180.   int movimientos_realizados = 0;
  181.   int x2, y2;
  182.   const ncuadrado = n * n;
  183.   static long unsigned num_movimientos_caballo = 0;
  184.  
  185.   do
  186.     {
  187.       movimiento_acertado = FALSE;
  188.       x2 = x1 + dif_x[movimientos_realizados];
  189.       y2 = y1 + dif_y[movimientos_realizados];
  190.       movimientos_realizados++;
  191.       if (kbhit ())
  192.         if (getch () == ESC)
  193.           exit (1);
  194.       printf ("Número de movimientos del caballo (ESC para salir): "
  195.               "%ldr", ++num_movimientos_caballo);
  196.       if (en (x2, 1, n) && en (y2, 1, n) && tab (x2, y2) == 0)
  197.         {
  198.           tab (x2, y2) = i;
  199.           if (i < ncuadrado)
  200.             {
  201.               ensayar (i+1, x2, y2);
  202.               if (! movimiento_acertado)
  203.                 tab (x2, y2) = 0;
  204.             }
  205.           else
  206.             movimiento_acertado = TRUE;
  207.         }
  208.     } while (! movimiento_acertado &&
  209.              movimientos_realizados != NUM_MOVIMIENTOS_POSIBLES);
  210. }
  211.  
  212.  
Solo C que nada C.

adocrates

  • Miembro activo
  • **
  • Mensajes: 54
    • Ver Perfil
TABLERO DE AJEDREZ
« Respuesta #2 en: Viernes 22 de Noviembre de 2002, 16:09 »
0
Código: Text
  1. #include <stdio.h>
  2.  
  3. #define N_CUADROS  8
  4. #define N_SALTOS   8
  5. #define CIERTO 1
  6. #define FALSO  0
  7.  
  8. static int tablero_virtual[N_CUADROS+4][N_CUADROS+4];
  9. static int dx[N_SALTOS]={ 2, 1,-1,-2,-2,-1, 1, 2};
  10. static int dy[N_SALTOS]={ 1, 2, 2, 1,-1,-2,-2,-1};
  11.  
  12. static void inicia_tablero(void);
  13. void presenta_tablero(void);
  14. static int ensaya_movimiento(int n,int x,int y);
  15.  
  16.  
  17. int main(void)
  18. {
  19.  
  20.   inicia_tablero();
  21.   printf("ncalculando, espere por favorn");
  22.   if(ensaya_movimiento(1,2,2))
  23.     printf("Resultado:");
  24.   else
  25.     printf("No hay soluci¢n");
  26.   presenta_tablero();
  27.   return 0;
  28. }
  29.  
  30. static void inicia_tablero(void)
  31. {
  32.   int i,j;
  33.   for(i=0;i<N_CUADROS+4;i++) {
  34.     for(j=0;j<N_CUADROS+4;j++) {
  35.       if(i>1 && i<N_CUADROS+2 && j>1 && j<N_CUADROS+2 )
  36.            tablero_virtual[i][j]=0;
  37.       else
  38.            tablero_virtual[i][j]=-1;
  39.     }
  40.   }
  41.  
  42. }
  43.  
  44. void presenta_tablero(void)
  45. {
  46.   int i,j;
  47.  
  48.   for(i=0;i<N_CUADROS+4;i++) {
  49.      printf("n");
  50.      for(j=0;j<N_CUADROS+4;j++) {
  51.         if(tablero_virtual[i][j]!=-1)
  52.          printf("%4d",tablero_virtual[i][j]);
  53.      }
  54.   }
  55.   return;
  56. }
  57.  
  58. static int ensaya_movimiento(int n,int x,int y)
  59. {
  60.   int i,u,v;
  61.   tablero_virtual[x][y]=n;
  62.   if(n==(N_CUADROS*N_CUADROS))
  63.       return CIERTO;
  64.   else {
  65.     for(i=0;i<N_SALTOS;i++) {
  66.       u=x+dx[i];
  67.       v=y+dy[i];
  68.       if(tablero_virtual[u][v]==0) {
  69.         if(ensaya_movimiento(n+1,u,v))
  70.           return CIERTO;
  71.       }
  72.    }
  73.   }
  74.   tablero_virtual[x][y]=0;
  75.   return FALSO;
  76. }
  77.  
Solo C que nada C.