Nreinas
Nreinas
Nreinas
INDICE
Se trata de colocar N reinas en un tablero de NxN de tal forma que no se puedan comer. En la
figura 1 se muestran los movimientos posibles de una reina en un tablero de 4x4
(movimientos horizontales, verticales y diagonales), mientras que la figura 2 muestra un
ejemplo de dos reinas que pueden comerse.
2 Solución secuencial
Ubicada una reina en una casilla determinada por la tupla [fila, columna] (por ejemplo, en la
casilla [1,4] para la reina de arriba en la figura 3), ya no puede colocarse ninguna otra reina ni
en la fila 1 ni en la columna 4. Debido a esta propiedad, podemos representar el tablero como
un vector[N] en lugar de una matriz[N,N].
La idea es que el vector se indexe por columna, e indique en cada posición “columna” la fila
en la que está ubicada una reina.
El algoritmo consistirá en un procedimiento recursivo “NReinas (int reina)” que se invoca por
primera vez como NReinas(1) con la idea de que coloque la primera reina y luego se vaya
llamando de forma recursiva para colocar la reina 2 y sucesivas. Convenimos en que cada
reina iésima, se coloca siempre en la fila iésima y una columna donde no sea comida para lo
cual se explorará desde la columna 1 a la N.
Hemos particularizado el programa para que imprima la primera solución que encuentra, pero
informe del total de soluciones posibles.
nreinas 8
que produciría una salida como la siguiente:
Q * * * * * * *
* * * * Q * * *
* * * * * * * Q
* * * * * Q * *
* * Q * * * * *
* * * * * * Q *
* Q * * * * * *
* * * Q * * * *
Numero de soluciones: 92
Tiempo total => 0:0 seg:miliseg
3 Tabla de tiempos
Los datos que figuran en la tabla siguiente se han obtenido ejecutando el programa “nreinas”
en un equipo del lab4401 con Intel i7-10700 a 2,9 GHz con 16MB de caché L3 compartida
por los ocho cores [con el HyperThreading deshabilitado] y 8GB de memoria. Los tiempos en
los equipos del lab4406 son algo mayores.
5 Listado de programas
El conjunto de ficheros de apoyo que se suministran son los siguientes:
5.1 nreinas.c
//-------------------------------------------------------------------+
// PCM. Arquitecturas Avanzadas Curso 16/17 ETSISI 08/02/17 |
// |
// nreinas: Problema de las N reinas en secuencial |
//-------------------------------------------------------------------+
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/time.h>
#define TRUE 1
#define FALSE 0
#define MAX_REINAS 25
//-------------------------------------------------------------------+
// VARIABLES GLOBALES |
//-------------------------------------------------------------------+
//-------------------------------------------------------------------+
int aceptable (int reinaFila, int reinaColumna) {
int col;
if (reinaEnFila[reinaColumna]!=0)
return FALSE; // Reina en la misma columna
for(col=1; col<=numReinas; col++)
// Si hay una reina que me come en diagonal no es aceptable
if ( ((reinaEnFila[col] != 0)
&& (abs(reinaEnFila[col]-reinaFila))==(abs(reinaColumna-col))))
return FALSE;
return TRUE;
}
for(col=1;col<=numReinas;col++) {
if(aceptable(reina,col)) {
reinaEnFila[col]=reina; // Reina i siempre se ubica en fila i
if (reina==numReinas) {
if (soluciones==0) {
printf("\n\n");
for (fila=1;fila<=numReinas;fila++) {
for(columna=1;columna<=numReinas;columna++) {
if (fila!=reinaEnFila[columna]) printf(" *");
else printf(" Q");
}
printf("\n");
}
}
soluciones++;
}
else NReinas(reina+1);
reinaEnFila[col]=0;
}
}
}
//-------------------------------------------------------------------+
int main (int argc, char *argv[]) {
int i;
struct timeval t0, tf, t;