import java.util.Scanner;
/**
* Loest das N-Damen-Problem mittels Backtracking.
*/
public class Queens {
/**
* Aufruf des Damenproblems.
* @param args nicht verwendet.
*/
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("n-Daten-Problem");
System.out.println();
System.out.print("n: ");
int n = in.nextInt();
int[] q = queens(n);
print(q);
}
/**
* Berechnet eine Loesung des N-Damen-Problems.
* Die Position in x-y-Richtung wird jeweils ab 0 gezaehlt.
*
* @param n Anzahl der Damen.
* @return Array mit den Positionen.
*/
public static int[] queens(int n) {
int[] q = new int[n];
queens(q, 0);
return q;
}
/**
* Gibt eine Loesung für das in den ersten col
* Spalten gefuellte Feld? Wenn es eine Loesung gibt, ist das Feld qs
* vollstaendig mit den korrekten Positionen gefuellt.
*
* @param qs Array der Damen-Positionen.
* @param col Anzahl der bereits gesetzen Spalten.
* @return true wenn es eine Loesung gibt.
*/
private static boolean queens(int[] qs, int col) {
if (col == qs.length)
return true;
// finde die Erstbeste passende Zeile (row)
for (int row = 0; row < qs.length; row++) {
if (isSafe(qs, row, col)) {
qs[col] = row;
// wenn auch der Rest gesetzt werden kann,
// sind wir fertig
if (queens(qs, col+1)) return true;
}
}
return false;
}
/**
* Steht die neue Dame auf der Position row,col sicher, so dass Sie
* nicht von den anderen zuvor gesetzten Damen in den Spalten
* 0 bis col-1 geschlagen werden kann?
*
* @param qs Array der Damenpositionen
* @param row Zeile der neuen Dame
* @param col Position der neuen Dame
* @return true wenn die neue Dame sicher steht.
*/
private static boolean isSafe(int[] qs, int row, int col) {
int up = row;
int down = row;
boolean isStillSafe = true;
for (int c = col-1; isStillSafe && c >= 0; c--) {
int r = qs[c];
isStillSafe = r != row && r != ++up && r != --down;
}
return isStillSafe;
}
/**
* Gibt die Damenpositionen aus.
*
* @param qs Damenpositionen.
*/
private static void print(int[] qs) {
System.out.printf("Lösung: ");
for (int i = 0; i < qs.length; i++)
System.out.printf("%4d", qs[i]+1);
System.out.printf("%n");
}
}