martes, 29 de julio de 2008

Cuadrado Latino - Código en C

Del Wikipedia tenemos que:

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.
Ejemplos de cuadrado latino:

El profesor de la asignatura de Estructuras de Datos, como desafío personal y a modo de practicar para comprender el concepto de recursividad, nos instó a realizar un programa que resolviera el problema de las "8 reinas" o el "cuadrado latino". Hice el segundo y a continuación les dejo el resultado, pero, te sugiero que lo intentes hacer tú primero.

//Algoritmo: Cuadrado Latino.
//Autor: John Salazar C.

#include stdio.h
#define max 10

int resuelve(int vector[],int L1,int L2,int L3,int L4);

int main(void){
int vector[max],i=0,n,a1,a2,a3,a4;
printf("CUADRADO LATINO CON RECURSIVIDAD\n");
printf("Introduzca cantidad elementos: ");
scanf("%d",&n);
printf("Ingrese los elementos (distintos): \n");
for(i=0;i scanf("%d",&vector[i]);
}
a1=0;
a2=n-1;
a3=n;
a4=n-1;
resuelve(vector,a1,a2,a3,a4);
return(0);
}

int resuelve(int vector[],int L1,int L2,int L3,int L4){
if(L2>=0){
if(L1==L2&&L3>L4){
printf("\t%d",vector[L1]);
printf("\n");
L1=0;
L3=L2;
L2--;
return resuelve(vector,L1,L2,L3,L4);
}
if(L3<=L4){
printf("\t%d",vector[L3]);
L3++;
return resuelve(vector,L1,L2,L3,L4);
}else{
printf("\t%d",vector[L1]);
L1++;
return resuelve(vector,L1,L2,L3,L4);
}
}
return(0);
}


Clave:

para cada línea de la matríz, ocurren 2 ciclos:

ciclo 1: desde L1 a L2
ciclo 2: desde L3 a L4

Para la primera linea, el ciclo 2 no participa.

3 comentarios:

Renato G. dijo...

Hola... esa definicion de cuadrado latino me recuerda al juego sudoku... hace 1 par de años implementé un algoritmo para solucionar sudokus usando recursividad... puedes encontrarlo visitando http://infnato.blogspot.com
Lo colgare en 2 dias maximo...
Un saludo!

paqui dijo...

Hola!

Me resulta muy útil este código, porque es muy limpio, pero veo que está incompleto.

En la sentencia del for: printf("Ingrese los elementos (distintos): \n");
for(i=0;i
scanf("%d",&vector[i]);

Ya ves que la sentencia del for está incompleta. ¿Podrías poner como es la solución completa?

Gracias de antemano.
PAQUI

John Salazar C. dijo...

Paqui,

Esta es la línea que está incompleta:

for(i=0;i(menor que)n;i++){

Espero te sirva.

Saludos,