Ver Mensaje Individual
  #1 (permalink)  
Antiguo 22/05/2012, 08:04
DickGumshoe
 
Fecha de Ingreso: enero-2012
Mensajes: 68
Antigüedad: 12 años, 3 meses
Puntos: 0
Cuadrado Latino

Hola.

Estoy implementando un Cuadrado Latino de orden n.

El enunciado dice:

Un cuadrado latino es una matriz de n × n elementos, en la que cada casilla está
ocupada por uno de los n símbolos de tal modo que cada uno de ellos aparece
exactamente una vez en cada columna y en cada fila. Las siguientes matrices son
cuadrados latinos:

1 2 3
2 3 1
3 1 2

Primero creo una matriz dinámica, y, después, con esta función, empiezo a crear el Cuadro Latino:

Código C:
Ver original
  1. int** LatinoFilas(int** M, contador contar, int n)
  2. {
  3.  
  4.     int k, repetir; //"Repetir" tendrá el número de veces que ha sido asignado un número que ya estaba en la misma fila.
  5.  
  6.      if(contar.j==0)
  7.      {
  8.         contar.fila = (int*) malloc (sizeof(int)); //Si "j" tiene el valor 0,  acabamos de empezar una fila, por lo que reservamos memoria para vector.
  9.         contar.cont++;
  10.      }
  11.  
  12.     if(contar.i==n) return M; //Si ya se han rellenado todos los espacios de la matriz, devolvemos M.
  13.  
  14.     else if(contar.j==n)  //Si el último espacio de la fila m de la matriz ya ha sido rellenado, empezamos a rellenar la siguiente fila de M.
  15.     {
  16.         contar.i++;
  17.         free(contar.fila);
  18.         contar.j=0;
  19.         return LatinoFilas(M, contar, n);
  20.     }
  21.  
  22.     else
  23.     {
  24.         contar.fila = (int*) realloc (contar.fila, (contar.cont+1) * sizeof(int));
  25.         contar.cont++;
  26.  
  27.         do
  28.         {
  29.  
  30.         M[contar.i][contar.j] = rand() % n;
  31.         repetir = 0;
  32.         for(k=0;k<contar.cont;k++) if(M[contar.i][contar.j] == contar.fila[k]) repetir++;
  33.         for(k=0;k<contar.i;k++)  if(M[contar.i][contar.j] == M[k][contar.j]) repetir++; //CUIDADO
  34.         }while(repetir > 0);
  35.  
  36.         contar.fila[contar.cont-1] = M[contar.i][contar.j];
  37.         contar.j++;
  38.         return LatinoFilas(M, contar, n);
  39.     }
  40. }

El programa compila y está bien hecho, lo único que quiero que haya el mismo número de símbolos diferentes que el orden de la matriz. Para ello, eso esto:

M[contar.i][contar.j] = rand() % n;

Pero, entonces, al compilar, tarda mucho en cargar la matriz, ya que es difícil que el ordenador no piense un número que no esté repetido en la misma fila y columna...

Si pongo, por ejemplo:

M[contar.i][contar.j] = rand() % 10;

y digo que la matriz sea de orden 3, me salen los valores en menos de 1 segundo.

Entonces, ¿estoy haciendo algo mal, o no se puede hacer cómo lo estoy haciendo?

Muchas gracias.

Saludos.