Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - Marco_ant

#1
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


#include <stdio.h>
#include <stdlib.h>
#define ncuad n*n
#define n 8


void mover(int matriz1[][n],int i, int pos_x, int pos_y, int *q);

const int ejex[8] = { -1,-2,-2,-1, 1, 2, 2, 1 },
         ejey[8] = { -2,-1, 1, 2, 2, 1,-1,-2 };

int main (void)

{



   int matriz1[n][n],i,j,q;

   for(i=0;i<n;i++)
   {
       for(j=0;j<n;j++)
       {
           matriz1[i][j]=0;
       }
   }


   matriz1[0][0]=1;
   mover(matriz1,2,0,0,&q);

   printf("\n\t");
   printf("Estos son los valores de la matriz \n\n");
   printf("\t\t MATRIZ ORDENADA ");
   for(i=0;i<n;i++)
   {
       printf("\n");
       for(j=0;j<n;j++)
       {
           printf("%6d", matriz1[i][j]);
       }
   }

   printf("\n");


   return 0;
}
void mover(int matriz1[][n],int i, int pos_x, int pos_y, int *q)
{
 int k, u, v;

 k = 0;
 *q = 0;
 do {
   u = pos_x + ejex[k]; v = pos_y + ejey[k]; /* seleccionar candidato */
   if (u >= 0 && u < n && v >= 0 && v < n) { /* esta dentro de los limites? */
     if (matriz1[u][v] == 0) {  /* es valido? */
       matriz1[u][v] = i;  /* anota el candidato */
       if (i < ncuad) {  /* llega al final del recorrido? */
         mover(matriz1,i+1,u,v,q);
       if (*q) matriz1[u][v] = 0; /* borra el candidato */
       }
       else *q = 1; /* hay solucion */
     }
   }
   k++;
 } while (!*q && k < 8);
}



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