Está en la página 1de 4

Universidad Sergio Arboleda

Análisis de Algoritmos
Trabajo: 8 Reinas en el tablero de ajedrez
Presentado por: Miguel Salazar y Diego Bermúdez.

A. Requerimientos:

Ubicar 8 reinas en un tablero de ajedrez de tal manera que ninguna pueda atacar a otra reina.

B. Clases:

Para este proyecto se utilizó el modelo MVC, de tal manera que fuese posible evidenciar la
solución mediante el uso de una interfaz de usuario.

Dentro del paquete modelo, se crearon tres clases: Modelo, Casilla e IntPair, que son aquellas
que contienen la parte lógica del ejercicio y se estructuran de la siguiente manera:

La clase Casilla tiene como propósito emular una casilla en un tablero de ajedrez. Por lo tanto,
tiene una ubicación espacial (x e y), además de un booleano que indica si hay una reina ubicada
en la casilla, así como un booleano que indica si la casilla está disponible, es decir, que no se
encuentra en el área de ataque de otra reina.

La clase IntPair solo tiene un objetivo y es poder almacenar la ubicación bidimensional de una
casilla en términos de fila y columna.
La clase Modelo es aquella que contiene la parte lógica del programa. Contiene los métodos
ubicarReina(), en el cual se ubica una reina en determinada casilla y se invalidan todas las casillas
que se consideren dentro del “área de ataque” de la reina ubicada. También tiene el método
setReinas(), en el cual se indica la posición inicial de una reina y se rellenan los espacios
disponibles con otras reinas. El resto de métodos no son de particular relevancia en la lógica del
programa.

C. Métodos:

A continuación unas porciones de código de los métodos relevantes para dar solución al
problema:

1. ubicarReina(): Este es un método en el cual se ubica una reina en determinada casilla y se


deshabilitan todas las casillas del tablero que estén en su área de ataque.

public void ubicarReina(int fila, int columna){

tableroModelo[fila][columna].setHayReina(true);
tableroModelo[fila][columna].setCasillaDisponible(false);
int dif = fila - columna;
int sum = fila + columna;
for (int i = 0; i < tableroModelo.length; i++) {
for (int j = 0; j < tableroModelo.length ; j++) {
tableroModelo[fila][j].setCasillaDisponible(false);
tableroModelo[i][columna].setCasillaDisponible(false);
if(j == i-dif){
tableroModelo[i][j].setCasillaDisponible(false);
}
if(i+j == sum){
tableroModelo[i][j].setCasillaDisponible(false);
}
}
}
this.vista.getPanel().setTableroVista(this.tableroModelo);
this.vista.repaint();
}

2. setReinas(): Este método es recursivo y se acude a la recursión cuando no fue posible


ubicar las 8 reinas en el tablero.

public void setReinas(int fila, int columna, ArrayList<IntPair> lista){


if (numReinas()==8){
System.out.println("Eureka");
}
else{
initTablero();
ubicarReina(fila,columna);
for (int i = 0; i < tableroModelo.length; i++) {
for (int j = 0; j < tableroModelo.length ; j++) {
if(tableroModelo[i][j].isCasillaDisponible()){
ubicarReina(i,j);
}
}
}
System.out.println("Fila: " + fila + " Columna: " + columna);
lista.remove(0);

this.setReinas(lista.get(0).getFila(),lista.get(0).getColumna(),lista);
}
}

D. Resultado:

A continuación una captiura de pantalla en la que se evidencia una de las posibles soluciones al
problema planteado:

También podría gustarte