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
int** 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.cont++; do { 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.