Problém 8 dám

Created: 2008-06-19 - 16:42

Untitled
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);
	}
}