Bueno amigos, he encontrado este código en C que usa recursividad:
http://elvex.ugr.es/decsai/c/problemas/reinas/reinas2.c
Estoy intentando pasarlo a no recursivo y me tiene loco porque no veo el modo de hacerlo. El caso es que, como dije, la recursividad y yo somos enemigos declarados y me pierdo cuando intento entender una funcion recursiva por muy sencilla que sea jajaja. Aqui está lo que llevo:
Código C:
Ver original// Problema de las N reinas
// ------------------------
// Algoritmo recursivo
//
// 0. Obviamente, colocaremos una reina en cada fila
//
// 1. Se coloca una reina en una casilla de su fila y,
// a continuación, se intentan colocar las reinas restantes.
//
// 2. Si las demás reinas no se pueden colocar con éxito,
// probamos a colocar la reina actual en otra columna.
//
// Caso base: Cuando no quedan reinas por colocar.
#include <stdio.h>
#include <stdlib.h>
// Constantes simbólicas
#define TRUE 1
#define FALSE 0
// Comprobar si una reina está bien colocada
// -----------------------------------------
// La reina de la fila i está bien colocada si no está
// en la columna ni en la misma diagonal que cualquiera
// de las reinas de las filas anteriores
//
// Parámetros
// fila - Fila de la reina cuya posición queremos validar
// reinas - Vector con las posiciones de las reinas
// n - Número de reinas
int comprobar (int fila, int reinas[], int n)
{
int i;
for (i=0; i<fila; i++)
if ( ( reinas[i]==reinas[fila] ) // Misma columna
|| ( abs(fila
-i
) == abs(reinas
[fila
]-reinas
[i
]) ) ) // Misma diagonal return FALSE;
return TRUE;
}
// Mostrar el tablero con las reinas
// ---------------------------------
// Parámetros:
// reinas - Vector con las posiciones de las distintas reinas
// n - Número de reinas
void mostrarTablero (int reinas[], int n)
{
int i,j;
for (i=0; i<n; i++) {
for (j=0; j<n; j++) {
if (reinas[i]==j)
else
}
printf(" %d %d\n",i
,reinas
[i
]); }
}
// Colocación de una reina
// -----------------------
// Parámetros
// fila - Fila de la reina que queremos colocar
// reinas - Vector con las posiciones de las reinas
// n - Número de reinas
int colocarReina (int fila, int reinas[], int n)
{
int ok = FALSE;
if (fila<n) {
// Quedan reinas por colocar
// Comprobamos si la posición
// de la reina actual es válida
if (comprobar(fila,reinas,n)) {
// Si es así, intentamos colocar
// las reinas restantes
ok = TRUE;
}
} else {
// No quedan reinas por colocar (solución)
mostrarTablero(reinas,n);
}
return ok;
}
// Mostrar información acerca del uso del programa
// -----------------------------------------------
// Parámetro:
// programa - Nombre del programa
void mostrarAyuda (char *programa)
{
printf("Al princicio nos pide el numero de reinas que deseamos colocar en el tablero.\n"); printf("El numero de reinas sera igual a las dimensiones del tablero, osea que\n"); printf("el tablero tendra un tamaño de nReinas x nReinas.\n"); printf("El valor minimo permitido es 4 y el maximo es 10.\n"); }
// Programa principal
// ------------------
int main (int argc, char *argv[])
{
int *reinas; // Vector con las posiciones de las reinas de cada fila
int nreinas; // Número de reinas
int i; // Contador
int fila;
int nposibles,probados=0;
// Obtener el número de reinas
printf("Introduce el numero de reinas: ");
if(nreinas >=4 && nreinas <=10){
// Colocar las reinas en el tablero
// Crear vector dinámicamente
reinas
= (int*) malloc ( nreinas
*sizeof(int) );
// Inicializar vector:
// (inicialmente, ninguna reina está colocada)
for (i=0; i<nreinas; i++)
reinas[i] = -1;
//Obtener el numero de combinaciones posibles
for(i=1,nposibles=1;i<=nreinas;i++)
nposibles *= i;
// Colocar reinas
do{
fila=0;
for (reinas[fila]=0; reinas[fila]<nreinas; reinas[fila]++) {
if(colocarReina(fila,reinas,nreinas) == TRUE){
fila++;
}else{
break;
}
}
probados++;
}while(nposibles > probados);
// Liberar memoria
} else {
mostrarAyuda(argv[0]);
}
return 0;
}
¿Podriais echarme una mano diciendome que debo cambiar y sobre todo explicarme que hago mal?