Cuadrado latino en pascal

Quien le pueda intersar:
Necesito generar una matriz de orden n por n (igual numero de filas y columnas) con un patrón por filas llamado cuadradro latino, para el que no lo conoce, es así:
1 2 3 4 n-3 n-2 n-1 n
4 1 2 3 n n-3 n-2 n-1
3 4 1 2 n-1 n n-3 n-2
2 3 4 1 n-2 n-1 n n-3
A la izquierda en ejemplo para una matriz 4 x 4, a la derecha el comportamiento por filas que tiene la matriz. Me interesa crear el procedimiento general, claro con limite, supóngase máximo para una matriz 15 x 15, pero necesito que el programa imprima la matriz a partir del orden ingresado por el usuario.
Me cuesta trabajar con estos proyectos bidimensionales de matrices en general, mi vago aporte es:
1ero. Pedir el orden al usuario.
2do. A partir de ese orden crear un doble ciclo dejando el ciclo filas afuera del que recorre las columnas para hacer el llenado horizontalmente primero (por filas).
3ro. Pensaba en la posibilidad de crear una variable que fuera aumentando su valor, como especie de contador dentro del ciclo interno, el de las columnas, que de alguna manera lo utilizara para restarcelo al n (orden definido por el usuario), e ir llenando las casillas con esa resta, pero noc nada más, algo así como:
for j:=1 to n do
begin {for filas}
for i:=1 to n do
u:=? (*posible constante que se inicializara al cambiar de fila*)
Matriz[j,i] :=n-u
Es todo lo que tengo en mente.

1 Respuesta

Respuesta
1
Te hice así... rápidamente... sin funciones ni procedimientos... pero eso se puede agregar fácilmente...
Pero espero te sirva la resolución...
Var
  mat:Array [1..15, 1..15] of byte;
  n:Integer;
  des:Integer;
  i,j:Integer;
Begin
  Write('Ingrese el valor de N. :');
  ReadLn(n);
  { Generacion de Matriz }
  des:=n-1;
  for i:=1 to n do
   Begin
    for j:=1 to n do
      Begin
        mat[i,j]:=n - des;
        if (j<>n)
          then des:= des - 1;
        if (des < 0) then des:=n-1;
      End;
   End;
  { Imprime Matriz }
  for i:=1 to n do
   Begin
    for j:=1 to n do
      write(mat[i,j]:4, ' ');
    writeLn;
   End;
End.
Gracias por tu rápida respuesta... veras aun no lo he probado, esta no esmi maquina y tengo que esperar ir a mi casa a donde tengo el programa instaladao para probarlo. Viéndolo trataba de entender el funcionamiento de la variable "des" :
Begin
  mat[i,j]:=n - des; (* 1era asignacion*)
  if (j<>n)
     then des:= des - 1;
     if (des < 0) then des:=n-1;
End;
Luego de que realiza la 1era asignación, porqué luego evalúo si j es diferente de n y des < 0 ¿?... Me cuesta aveces entender nomesclaturas que no sean mías, por eso en la medida de las posibilidades podrías, si podrías explicarme literalmente el funcionamiento del proceso... Muchas gracias igual por el previo aporte...
Jajaja, no, todo bien, yo tampoco fui muy claro con las nomenclaturas...
El des, es una variable de desplazamiento
Lo que intennte hacer es... por ejemplo... la 1er fila ir de n - (n-1) hasta n
Pero... en la segunda linea... lo que hago es arracancar con el desplazamiento de la linea anterior... y a partir de allí, sigo restando, verificando que no se ponga negativo.
n-3   n-2   n-1   n
Luego, en la primer columna pongo el desplazamiento obtenido en la ultima columna de la fila anterior
n n-3 n-2 n-1
lo mismo aquí
n-1 n n-3 n-2
y aquí
n-2 n-1 n n-3
¿Me explico?

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas