! Las 8 reinas
! Colocar 8 reinas en un tablero de ajedrez sin que se puedan
El problema de las Ocho Reinas comer unas a otras
! No puede haber dos reinas en la misma columna: ! Para la comunicación entre reinas, se puede organizar de
! Las reinas se pueden asignar a columnas distintas, entonces manera que cada reina tenga la referencia de la de su
el problema se reduce a encontrar las filas donde colocarlas izquierda
! Cada reina conoce las posiciones que puede atacar ! Será a esa reina a la que pueda enviar mensajes
! A cada reina se le puede pedir que proponga una solución, ! Las peticiones en el programa se harán a la reina que esté
y más tarde que proponga otra solución más a la derecha
! Se trata de la estrategia generar y probar
• Primero se genera una solución
• Luego se comprueba si es buena D8
• Si no lo es, volvemos a intentarlo
D3 D5 D7
D2
D1 D4 D6
! Comprueba si la reina o una a su izquierda puede atacar ! Para encontrar una solución una reina le pregunta a sus
una posición vecinas si pueden atacarla
! Si no pueden atacarla es que se ha alcanzado una solución
private boolean puedeAtacar(int testfila, int testcolumna) { ! Si pueden atacarla, avanza una posición
int diferenciaColumnas = testcolumna - columna;
if ((fila == testfila) || // en la misma fila public boolean buscaSolución() {
(fila + diferenciaColumnas == testfila) || // o en una diagonal // si nadie la puede atacar ya es una solución:
(fila - diferenciaColumnas == testfila)) if ( vecina == null || !vecina.puedeAtacar(fila, columna) )
return true; return true;
if (vecina != null) // mira si es atacable por las reinas a la izda. // si no, intenta avanzar a donde no la puedan atacar:
return vecina.puedeAtacar(testfila, testcolumna); if ( avanzar() ) return true;