In meiner Aufgabe soll das N-Damenproblem (Damenproblem ? Wikipedia) spaltenweise gelöst (aufgebaut werden). Die position der Damen wird in einem int[] gespeichert.
Mein Problem ist der rekursive Aufruf der methode extend(oldBoard), die ein übergebenes board der grösse n x m mit m damen auf ein n x n board mit n damen erweitern soll.
Die Klasse Board:
Die Klasse Queensproblem:
Mein Programm erzeugt zb für n = 3 folgende ausgabe (" x " = damen, " . " = leeres feld) :
x
.
.
x
.
.
x x
. .
. .
x
.
.
x .
. x
. .
x
.
.
x .
. .
. x
x .
. .
. x
x . x
. . .
. x .
x .
. .
. x
x . .
. . x
. x .
x .
. .
. x
x . .
. . .
. x x
Natürlich sollte mein Programm jetzt beginnen, die erste dame nun ein feld nach unten zu setzen und dann wieder versuchen das feld aufzubauen so dass keine konflikte vorliegen (und bei 3x3 zu dem ergebnis kommen das es keine lösung gibt).
Vielen Dank für die Hilfe
Johannes
Mein Problem ist der rekursive Aufruf der methode extend(oldBoard), die ein übergebenes board der grösse n x m mit m damen auf ein n x n board mit n damen erweitern soll.
Die Klasse Board:
Java:
public class Board {
private final int[] board;
private final int numberOfRows;
public Board(int numberOfRows) {
this(0, numberOfRows);
}
private Board(int numberOfColumns, int numberOfRows) {
this.board = new int[numberOfColumns];
this.numberOfRows = numberOfRows;
}
public boolean hasConflict() {
//prüft ob in der aktuellen Belegung eine Dame eine andere bedroht
}
public Board newColumn(int rowPosOfQueen) {
// fügt dem board eine neue Spalte mit einer dame an Position
// rowPosOfQueen hinzu
int oldLength = board.length;
Board newBoard = new Board(oldLength + 1, numberOfRows);
System.arraycopy(board, 0, newBoard.board, 0, oldLength);
newBoard.board[oldLength] = rowPosOfQueen;
return newBoard;
}
Die Klasse Queensproblem:
Java:
public class QueensProblem {
private final int n;
boolean conflict;
private Board extend(Board oldBoard) {
// erweitert das übergebene Board um eine spalte und prüft
// ob in der neuen Belegung eine Dame eine andere bedroht. Falls
// nicht soll durch rekuriven aufruf ein board der grösse n x n entstehen.
// falls keine Lösung gefunden wird, soll ein leeres brett zurückgegeben
// werden.
if(oldBoard.getNumberOfColumns() == n) {
return oldBoard;
}
else {
int i = 0;
boolean solutionFound = false;
Board extendedBoard = new Board(1);
while (i < n && solutionFound == false) {
extendedBoard = oldBoard.newColumn(i);
System.out.println(oldBoard);
System.out.println(extendedBoard);
boolean test = extendedBoard.hasConflict();
if (test == true) {
i++;
solutionFound = false;
} else if (test == false && extendedBoard.getNumberOfColumns() == n) {
solutionFound = true;
}
else {
return extend(extendedBoard);
}
}
if (i == n && solutionFound == false) {
Board empty = new Board(n);
return empty;
}
else {
return extendedBoard;
}
}
}
}
Mein Programm erzeugt zb für n = 3 folgende ausgabe (" x " = damen, " . " = leeres feld) :
x
.
.
x
.
.
x x
. .
. .
x
.
.
x .
. x
. .
x
.
.
x .
. .
. x
x .
. .
. x
x . x
. . .
. x .
x .
. .
. x
x . .
. . x
. x .
x .
. .
. x
x . .
. . .
. x x
Natürlich sollte mein Programm jetzt beginnen, die erste dame nun ein feld nach unten zu setzen und dann wieder versuchen das feld aufzubauen so dass keine konflikte vorliegen (und bei 3x3 zu dem ergebnis kommen das es keine lösung gibt).
Vielen Dank für die Hilfe
Johannes