Problém 8 dám
Created: 2008-06-19 - 16:42
public class ProblemDam {
static int x[] = new int[8];
static int vysledok[] = new int[8];
static boolean a[] = new boolean[8];
static boolean b[] = new boolean[15];
static boolean c[] = new boolean[15];
static boolean koniec = false;
/**
* @param args
*/
public static void main(String[] args) {
for (int i = 0; i < 8; i++) {
a[i] = true;
}
for (int i = 0; i < 15; i++) {
b[i] = true;
c[i] = true;
}
ulozDalsiuDamu(0, koniec);
System.out.println("Vysledok:");
for (int i = 0; i < 8; i++) {
System.out.print(vysledok[i] + " ");
}
System.out.println();
System.out.println("Sachovnica:");
for (int i = 0;i<8;i++){
for (int j=0;j<8;j++){
if(i==vysledok[j]) System.out.print("DD ");
else System.out.print(".. ");
}
System.out.println();
}
}
// cislovanie sachovnice je 0..7 x 0..7
public static void ulozDalsiuDamu(int ktoraDama, boolean koniec) {
int ktoryRiadok = -1; //kedze zacinam od nuly, tak na zaciatku je stav -1
do {
ktoryRiadok = ktoryRiadok + 1;
koniec = false;
if (a[ktoryRiadok] && b[ktoraDama + ktoryRiadok] && c[ktoraDama - ktoryRiadok + 7]) { //je umiestnitelna?
x[ktoraDama] = ktoryRiadok; //priradi na ktorom riadku bude aktualna dama
a[ktoryRiadok] = false; //nastavi cely riadok false (obsadeny)
b[ktoraDama + ktoryRiadok] = false; // nastavi diagonalu /
c[ktoraDama - ktoryRiadok + 7] = false; // nastavi diagonalu \
if (ktoraDama < 7) { //kym este je co umiestnovat
ulozDalsiuDamu(ktoraDama + 1, koniec); //rekurzia
if (!koniec) { //ak este nie je koniec vymaz damu z pozicie
a[ktoryRiadok] = true;
b[ktoraDama + ktoryRiadok] = true;
c[ktoraDama - ktoryRiadok + 7] = true;
}
}
else{ // ak su umiestnene vsetky - koniec
koniec = true;
for (int k = 0; k <= 7; k++) {
vysledok[k] = x[k];
}System.out.println();
}
}
} while (!koniec && ktoryRiadok != 7);
}
}