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 originalint** LatinoFilas(int** M, contador contar, int n)
{
int k, repetir; //"Repetir" tendrá el número de veces que ha sido asignado un número que ya estaba en la misma fila.
if(contar.j==0)
{
contar.
fila = (int*) malloc (sizeof(int)); //Si "j" tiene el valor 0, acabamos de empezar una fila, por lo que reservamos memoria para vector. contar.cont++;
}
if(contar.i==n) return M; //Si ya se han rellenado todos los espacios de la matriz, devolvemos M.
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.
{
contar.i++;
contar.j=0;
return LatinoFilas(M, contar, n);
}
else
{
contar.
fila = (int*) realloc (contar.
fila, (contar.
cont+1) * sizeof(int)); contar.cont++;
do
{
M
[contar.
i][contar.
j] = rand() % n
; repetir = 0;
for(k=0;k<contar.cont;k++) if(M[contar.i][contar.j] == contar.fila[k]) repetir++;
for(k=0;k<contar.i;k++) if(M[contar.i][contar.j] == M[k][contar.j]) repetir++; //CUIDADO
}while(repetir > 0);
contar.fila[contar.cont-1] = M[contar.i][contar.j];
contar.j++;
return LatinoFilas(M, contar, n);
}
}
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.