3 Stimmen

Das Lösen des Eight Queens-Problems mit einem 2D-Array: IndexOutOfBounds-Fehler

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

3voto

Amy Punkte 1732

Ändern Sie diese Zeile:

while ( !queenPlaced && (row < BOARD_SIZE) ) {

zu:

weil BOARD_SIZE auf 8 definiert ist, was die Größe des Arrays (8x8) ist, die isUnderAttack() Funktion über die Grenzen hinausgeht, wenn sie auf board[8][j] zugreifen will. Sie kann nur auf Zeilen von 0-7 zugreifen, nicht auf 8.

Außerdem müssen Sie möglicherweise die Zeile direkt darüber ändern (int row = 1;) und die row auf 0 setzen anstelle von eins (vorausgesetzt, Sie möchten von der ersten Zeile aus beginnen).

0voto

gmlacrosse Punkte 352

Da Sie Ihre Damen von der linken Spalte in die rechte Spalte setzen, sollten auf der rechten Seite keine Damen überprüft werden. Daher könnten Sie alle Überprüfungen auf der rechten Seite beseitigen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X