Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Cuadrado Latino

Estas en el tema de Cuadrado Latino en el foro de C/C++ en Foros del Web. Hola. Estoy implementando un Cuadrado Latino de orden n. El enunciado dice: Un cuadrado latino es una matriz de n × n elementos, en la ...
  #1 (permalink)  
Antiguo 22/05/2012, 08:04
 
Fecha de Ingreso: enero-2012
Mensajes: 68
Antigüedad: 12 años, 10 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.
  #2 (permalink)  
Antiguo 22/05/2012, 08:23
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 7 meses
Puntos: 228
Respuesta: Cuadrado Latino

El problema esta que a medida que n crece es poco probable que no se repitan numeros asi que eso le cuesta mucho procesamiento.... para mi gusto generar esto con numeros random es poco eficiente...

No se si el profesor les habra pedido esa cuestion de aleatoriedad sino no tienes sentido...porque ademas tienes que verificar si la fila esta repetida.

Cuando estas en el ultimo espacio que solo entra un numero el programa se queda tirando numeros random hasta que salga....

Si el profesor les pidio esa especie de aleatoriedad no hay mucho mas que hacer.
  #3 (permalink)  
Antiguo 22/05/2012, 08:37
 
Fecha de Ingreso: enero-2012
Mensajes: 68
Antigüedad: 12 años, 10 meses
Puntos: 0
Respuesta: Cuadrado Latino

Muchas gracias, sam90.

El profesor de mi hermana dice que sí hay que hacerlo aleatorio y usando el mismo número de caracteres diferentes que el orden de la matriz.
  #4 (permalink)  
Antiguo 22/05/2012, 08:51
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 7 meses
Puntos: 228
Respuesta: Cuadrado Latino

Entonce espera tranquilo... probabilisticamente es un programa lento.

Etiquetas: cuadrado, int, latino, matriz, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:35.