Tengo que hacer un programa que imprima un cuadrado latino de orden N

Me llamo eduardo soy de chile, y estudio informática. Bueno tengo que resolver un ejercicio y me gustaría que me ayudaras.
El problema es el siguiente:
Hacer un programa que imprima un cuadrado latino de orden N.
Un cuadrado latino de orden N es una matriz cuadrada con la que su primera fila contiene los N primeros números naturales y cada una de las siguientes N-1 filas contiene la rotación de la fila anterior un lugar a la derecha.
(Obligadamente debo implementarlo con arreglos o matrices, porque es la materia que me esta pasando ahora)
Ojala me pudieras ayudar, diciéndome como puedo resolver este problema. Recién estoy empezando con C.
3

3 respuestas

Respuesta
1
Vamos a ver si comprendo el problema.
Por ejemplo, para N=6, la matriz sería
1 2 3 4 5 6
0 1 2 3 4 5
0 0 1 2 3 4
0 0 0 1 2 3
0 0 0 0 1 2
0 0 0 0 0 1
¿Correcto?
Si pero en ves de los ceros (0), tiene que continuar los números:
123456
612345
561234
456123
345612
234561
Ayudame por favor, esto esta mu difícil
Saludos y gracias
eamd
Ahora mismo sólo se me ocurre el siguiente algoritmo:
Inicio
m <-- n
p <-- n
para i de 1 a m hacer
para j de 1 a n hacer
si i=1 entonces
matriz[j] <-- j
sino si matriz[i-1][j-1]=1 entonces
matriz[j] <-- n
Sino
Matriz[j] <-- matriz[i-1][j-1] - 1
finsi
finpara
finpara
Fin
No lo he probado; no sé si funcionará; lo he hecho a ojo. Impleméntalo en C y pruébalo. Ten en cuenta que en C los índices comienzan en cero.
Si me das tiempo, te lo traduzco a C, es que ahora mismo estoy ocupadillo.
Ok, muchas gracias nos comunicamos, en cualquier caso mi mail:[email protected]
Saludos
eamd
Ahí van el algoritmo y su implementación en C ya corregidos:
Inicio
para i de 1 a n hacer
para j de 1 a n hacer
si i=1 entonces
matriz[j] <-- j
sino si matriz[i-1][j]=1 entonces
matriz[j] <-- n
Sino
Matriz[j] <-- matriz[i-1][j] - 1
Finsi
Finpara
Finpara
Fin
Main()
{
int **matriz;
int n, i, j;
system("clear");
printf("Introduzca 'n': ");
scanf("%d", &n);
printf("\n");
matriz=(int **)malloc(n*(sizeof(int *)));
for(i=0;i<n;i++)
matriz=(int *)malloc(n*(sizeof(int)));
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(i==0)
matriz[j]=j+1;
else if(matriz[i-1][j]==1)
matriz[j]=n;
else
matriz[j]=matriz[i-1][j]-1;
printf("%d ", matriz[j]);
}
printf("\n");
}
printf("\n");
}
Respuesta
1
<%=Texto%>
Es muy difícil de explicar, te sugiero que lo pruebes y lo ejecutes en modo paso a paso para que vayas viendo como hace la matriz.
Mira no entiendo mucho, ya te dije recién estoy empezando, por fa explicame más
Saludos
Las funciones para resolver tu problema son las siguientes
MAX_N es la dimension máxima para la matriz, y N debe ser <= MAX_N y >=1, de lo contrario no la llena
#include <memory.h>
#define MAX_N 10
typedef int tipo;
int Rota(tipo *v, int n, int m) {
tipo *p;
if (m<0 || m>n)
return 1; //no se puede rotar
if (m==n)
return 0; //no hay necesidad de rotar
p = (tipo *)malloc(m*sizeof(tipo));
memcpy(p, &v[n-m], m*sizeof(tipo));
memmove(&v[m], v, (n-m)*sizeof(tipo));
memcpy(v, p, m*sizeof(tipo));
free(p);
return 0;
}
int LlenaCuadroLatino(tipo cl[MAX_N][MAX_N], int n) {
int i;
if (n<1 || n>MAX_N)
return 1;
for (i=0; i<n; i++)
cl[0] = i+1;
for (i=1; i<n; i++) {
memcpy(cl, cl[i-1], n*sizeof(tipo));
Rota(cl, n, 1);
}
return 0;
}
Respuesta
1
#include "stdafx.h"
#include <iostream.h>
int N=0;
int main( )
{
int cuadro[25][25];
cout << "Programa del cuadro latino\n";
cout << "Dimension del cuadro (N): ";
cout.flush();
cin >> N;
for (int i=0; i < N; i++)
{
cuadro[0] = i+1;
printf(" %d", cuadro[0]);
}
printf("\n");
for (i=1; i < N; i++)
{
for (int j=0; j < N; j++)
{
if (j == 0)
cuadro[j] = cuadro[i-1][N-1];
else
cuadro[j] = cuadro[i-1][j-1];
printf(" %d", cuadro[j]);
}
printf("\n");
}
return 0;
}
Te pongo aquí el código, es sencillo si no es lo que esperabas dímelo y vemos que se puede hacer.
Vago
Perdón por la tardanza, si quieres te puedo mandar el código a tu correo, creo que la solución es sencilla.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas