title: Eight Queens Algorithm
body: <p>I've asked earlier a question about solving the eight queens problem using Java.
  I got a backtracking algorithm to solve the problem.</p>
  
  <p>I tried to use this algorithm but I don't know what's wrong with my code. It places up to 7 queens only.</p>
  
  <p>Here's Queen Class:</p>
  
  <pre><code>    public class Queen {
      //Number of rows or columns
      public static final int BOARD_SIZE = 8;
  
      boolean[][] board;
      //Indicate an empty square
      public static final boolean EMPTY = false;
      //Indicate a square which containing a queen
      public static final boolean QUEEN = true;
      //Number of moves
      public static final int MOVES = 4;
      //Horizontal moves
      int[] horizontal;
      //Vertical moves
      int[] vertical;
  
      public int queens = 0;
  
      public Queen() {
          //Constructor creates an empty board
          board = new boolean[BOARD_SIZE][BOARD_SIZE];
          for (int row = 0; row &lt; board.length; row++) {
              for (int col = 0; col &lt; board[row].length; col++) {
                  board[row][col] = EMPTY;
              }
          }
  
          horizontal = new int[MOVES];
          vertical = new int[MOVES];
          // up right
          horizontal[0] = -1;
          vertical[0] = 1; 
          // down left
          horizontal[1] = 1;
          vertical[1] = -1;
          // up left
          horizontal[2] = -1;
          vertical[2] = -1;
          // down right
          horizontal[3] = 1;
          vertical[3] = 1;
      }
  
      public boolean placeQueens (int column) {
          if (column &gt; BOARD_SIZE) {
              return true;
          }
          else {
              boolean queenPlaced = false;
              int row = 1;
  
              while (!queenPlaced &amp;&amp; row &lt; BOARD_SIZE) {
                  if (isUnderAttack(row, column)) {
                      ++row;
                  }// end if
                  else{
                      setQueen(row, column);
                      queenPlaced = placeQueens(column + 1);
                      if (!queenPlaced) {
                          removeQueen(row,column);
                          ++row;
                      }// end if
                  }// end else
              }// end while
              return queenPlaced;
          }// end else
      }
  
      private void removeQueen(int row, int column) {
          board[row][column] = EMPTY;
          System.out.printf("queen REMOVED from [%d][%d]\n", row, column);
      --queens;
      }
  
      private void setQueen(int row, int column) {
          board[row][column] = QUEEN;
          System.out.printf("queen PLACED in [%d][%d]\n", row, column);
          ++queens;
      }
  
      public boolean isUnderAttack(int row, int col) {
          boolean condition = false;
          // check row
          for (int column = 0; column &lt; BOARD_SIZE; column++) {
              if ((board[row][column] == true)) {
                  condition = true;
              }
          }
  
          // check column
          for (int row_ = 0; row_ &lt; board.length; row_++) {
              if (board[row_][col] == true) {
                          condition = true;
              }
          }
  
          // check diagonal
          for (int row_ = row, col_ = col; row_ &gt;= 0 &amp;&amp; col_ &lt; 8; row_ += horizontal[0], col_ += vertical[0]) {
              if (board[row_][col_] == true) {
                  condition = true;
              }
          }
          for (int row_ = row, col_ = col; row_ &lt; 8 &amp;&amp; col_ &gt;= 0; row_ += horizontal[1], col_ += vertical[1]) {
              if (board[row_][col_] == true) {
                  condition = true;
              }
          }
          for (int row_ = row, col_ = col; row_ &gt;= 0 &amp;&amp; col_ &gt;= 0; row_ += horizontal[2], col_ += vertical[2]) {
              if (board[row_][col_] == true) {
                  condition = true;
              }
          }
          for (int row_ = row, col_ = col; row_ &lt; 8 &amp;&amp; col_ &lt; 8; row_ += horizontal[3], col_ += vertical[3]) {
              if (board[row_][col_] == true) {
                  condition = true;
              }
          }
  
          return condition;
      }
  
      public void displayBoard () {
          int counter = 0;
          for (int row = 0; row &lt; board.length; row++) {
              for (int col = 0; col &lt; board[row].length; col++) {
                  if (board[row][col] == true) {
                      System.out.printf("|%s|", "x");
                      counter++;
                  }
                  else {              
                      System.out.printf("|%s|", "o");
                  }
              }
              System.out.println();
          }
  
          System.out.printf("%d queens has been placed\n", counter);
      }
  }
  </code></pre>