Eine meiner Hausaufgaben ist die Lösung des Acht-Damen-Problems mit Hilfe eines zweidimensionalen Arrays zur Darstellung des Bretts. Ich erhalte ständig einen Array-Index außerhalb der Grenzen Fehler: 8 in meiner Methode "isUnderAttack" bei:
if (board[row][j] == QUEEN)
und in meiner Methode "placeQueen" bei:
if (isUnderAttack(row, column)) {
und
queenPlaced = placeQueens(column+1);
Wo könnte ich falsch liegen? Ich hätte mehr Tags zu diesem Beitrag hinzugefügt, aber ich bin ein neuer Benutzer und kann keine "neuen Tags" erstellen. Entschuldigung!
Hier ist, was ich erstellt habe:
public class Queens {
// Felder pro Reihe oder Spalte
public static final int BOARD_SIZE = 8;
// wird verwendet, um einen leeren Platz anzuzeigen
public static final int EMPTY = 0;
// wird verwendet, um anzuzeigen, dass der Platz eine Dame enthält
public static final int QUEEN = 1;
private int board[][]; // Schachbrett
public Queens() {
// -------------------------------------------------
// Konstruktor: Erstellt ein leeres quadratisches Brett.
// -------------------------------------------------
board = new int[BOARD_SIZE][BOARD_SIZE];
} // end constructor
public void clearBoard() {
// -------------------------------------------------
// Löscht das Brett.
// Vorbedingung: Keine.
// Nachbedingung: Setzt alle Plätze auf EMPTY.
// -------------------------------------------------
// gehe durch die Reihen
for (int i = 0; i < BOARD_SIZE; i++){
// gehe durch die Spalten
for (int j = 0; j BOARD_SIZE) {
return true; // Basisfall
}
else {
boolean queenPlaced = false;
int row = 1; // Anzahl der Damen in der Spalte
while ( !queenPlaced && (row <= BOARD_SIZE) ) {
// wenn das Feld angegriffen werden kann
if (isUnderAttack(row, column)) {
++row; // betrachte nächstes Feld in der Spalte
} // end if
else { // Dame platzieren und nächste Spalte betrachten
setQueen(row, column);
queenPlaced = placeQueens(column+1);
// wenn keine Dame in der nächsten Spalte möglich ist,
if (!queenPlaced) {
// Backtracking: zuvor platzierte Dame entfernen
// und nächstes Feld in der Spalte versuchen
removeQueen(row, column);
++row;
} // end if
} // end if
} // end while
return queenPlaced;
} // end if
} // end placeQueens
private void setQueen(int row, int column) {
// --------------------------------------------------
// Setzt eine Dame auf dem Feld, das durch
// Reihe und Spalte angegeben ist.
// Vorbedingung: Keine.
// Nachbedingung: Setzt das Feld auf dem Brett in
// einer gegebenen Reihe und Spalte auf QUEEN.
// --------------------------------------------------
board [row][column] = QUEEN;
} // end setQueen
private void removeQueen(int row, int column) {
// --------------------------------------------------
// Entfernt eine Dame an dem durch Reihe und
// Spalte angegebenen Feld.
// Vorbedingung: Keine.
// Nachbedingung: Setzt das Feld auf dem Brett in
// einer bestimmten Reihe und Spalte auf EMPTY.
// --------------------------------------------------
board [row][column] = EMPTY;
} // end removeQueen
private boolean isUnderAttack(int row, int column) {
// --------------------------------------------------
// Bestimmt, ob das Feld auf dem Brett an einer
// gegebenen Reihe und Spalte von Damen in den
// Spalten 1 bis Spalte-1 angegriffen wird.
// Vorbedingung: Jede Spalte zwischen 1 und Spalte-1
// hat eine Dame platziert in einer bestimmten Reihe.
// Keine dieser Damen kann von einer anderen angegriffen
// werden.
// Nachbedingung: Wenn das bestimmte Feld angegriffen wird, wird true
// zurückgegeben; sonst wird false zurückgegeben.
// --------------------------------------------------
//i = Reihen und j = Spalten
//----------------------------------------
//
// Überprüft vor und hinter dem Feld
//
//----------------------------------------
//sucht nach hinten nach Damen
for (int j = 0; j < column; j++){
if (board[row][j] == QUEEN)
return true;
}
//sucht vorne nach Damen
for (int j =column+1; j < BOARD_SIZE; j++){
if(board[row][j] == QUEEN)
return true;
}
//-----------------------------------------------------------------
//
// Überprüft diagonal vom Feld
//
//-----------------------------------------------------------------
for (int i = 1+row, j = 1+column; i < BOARD_SIZE && j < BOARD_SIZE; i++, j++){
if (board[i][j] == QUEEN)
return true;
}
for (int i= 1-row, j = 1-column; i >= 0 && j >=0; i--, j--){
if (board[i][j] == QUEEN)
return true;
}
for (int i= 1+row, j = 1-column; i < BOARD_SIZE && j >= 0; i++, j--){
if (board[i][j] == QUEEN)
return true;
}
for (int i= 1-row, j = 1+column; i >= 0 && j < BOARD_SIZE; i--, j++){
if (board[i][j] == QUEEN)
return true;
}
return false;
} // end isUnderAttack
private int index(int number) {
// --------------------------------------------------
// Gibt den Array-Index zurück, der einer
// Zeilen- oder Spaltennummer entspricht.
// Vorbedingung: 1 <= Nummer <= BOARD_SIZE.
// Nachbedingung: Gibt den angepassten Indexwert zurück.
// --------------------------------------------------
return number -1;
} // end index
} // end Queens