I am solving the 8 queens problem and I have most of the code done but I am gett
ID: 3706868 • Letter: I
Question
I am solving the 8 queens problem and I have most of the code done but I am getting a java.lang.NullPointerException in my isUnderAttack method and I'm not sure of how to fix it. My code is as posted below.
public class Queen {
public static final int BOARD_SIZE = 8;
public static final int EMPTY = 0;
public static final int QUEEN = 1;
private int board[][];
public void Queens(){
board = new int[BOARD_SIZE][BOARD_SIZE];
}
public void clearBoard(){
board = new int[BOARD_SIZE][BOARD_SIZE];
}
public void displayBoard(){
for ( int i = 0; i < BOARD_SIZE; i++) {
for( int j = 0; j < BOARD_SIZE; j++)
if (board[i][j] == QUEEN)
System.out.println("Queen at row " + (i+1) + " col " + (j +1));
}
for ( int i = 0; i < BOARD_SIZE; i++) {
System.out.println(" ");
for( int j = 0; j < BOARD_SIZE; j++)
if (board[i][j] == QUEEN)
System.out.print(" 1 ");
else System.out.print(" . ");
}
}
public boolean placeQueens(int column){
if(column >= BOARD_SIZE){
return true;
} else{
boolean queenPlaced =false;
int row = 1;
while(!queenPlaced && (row <= BOARD_SIZE)){
if (isUnderAttack(row, column)){ row++;
} else {
setQueen(row, column);
queenPlaced = placeQueens(column+1);
if(!queenPlaced){ removeQueen(row, column); ++row;
}
}
} return queenPlaced;
}
}
private void setQueen(int row, int column){
board[1][2] = QUEEN;
System.out.println("Queen placed at Col " + column +" row " + row);
} p
rivate void removeQueen(int row, int column){
board[row][column] = EMPTY;
System.out.println("Queen removed from Col " + column +" row " + row);
}
private boolean isUnderAttack(int row, int column) {
for ( int i = 0; i < BOARD_SIZE; i++) {
if (board[i][column] == QUEEN) return true;
}
for ( int i = 0; i < BOARD_SIZE; i++) {
if (board[row][i] == QUEEN) return true;
}
int r = row; int c = column;
while((r >= 0) && (c >= 0)) {
if (board[r][c] == QUEEN)
return true;
r--; c--;
}
r = row;
c = column;
while((r < BOARD_SIZE) && (c < BOARD_SIZE)) {
if (board[r][c] == QUEEN)
return true;
r++; c++;
}
r = row; c = column;
while((r >= 0 ) && (c < BOARD_SIZE)) {
if (board[r][c] == QUEEN)
return true;
r--; c++;
}
r = row; c = column;
while((r < BOARD_SIZE) && (c >= 0)) {
if (board[r][c] == QUEEN)
return true;
r++; c--;
}
return false;
}
private int index(int number){
return (number);
}
}
public static void main(String[] args){
Queen q = new Queen();
q.placeQueens(0);
q.displayBoard();
}
Explanation / Answer
Below is your code. I have added comments to help you uunderstand it ..
public class Queen {
// --------------------------static variables
// squares per row or column
public static final int BOARD_SIZE = 8;
// used to indicate an empty square
public static final int EMPTY = 0;
// used to indicate square contains a queen
public static final int QUEEN = 1;
// ------------------------------instance variables
private int board[][]; // chess board
// --------------------------constructor
public Queen() {
// -------------------------------------------------
// Constructor: Creates an empty square board.
// -------------------------------------------------
board = new int[BOARD_SIZE][BOARD_SIZE];
} // end constructor
// ------------------------------instance methods
public void clearBoard() {
board = new int[BOARD_SIZE][BOARD_SIZE]; // brute force
} // end clearBoard
// ---------------------------
public void displayBoard() {
for (int i = 0; i < BOARD_SIZE; i++) {
for (int j = 0; j < BOARD_SIZE; j++)
if (board[i][j] == QUEEN)
System.out.println("Queen at row " + (i + 1) + " col " + (j + 1));
}
// print out board
for (int i = 0; i < BOARD_SIZE; i++) {
System.out.println(" ");
for (int j = 0; j < BOARD_SIZE; j++)
if (board[i][j] == QUEEN)
System.out.print(" Q ");
else
System.out.print(" . ");
}
} // end displayBoard
// ------------------------------------
public boolean placeQueens(int column) {
System.out.println("placeQueens- trying column " + column);
if (column >= BOARD_SIZE) {
return true; // base case
} else {
boolean queenPlaced = false;
int row = 0; // number of square in column
while (!queenPlaced && (row < BOARD_SIZE)) {
// if square can be attacked
if (isUnderAttack(row, column)) {
++row; // consider next square in column
} // end if
else { // place queen and consider next column
setQueen(row, column);
queenPlaced = placeQueens(column + 1);
// if no queen is possible in next column,
if (!queenPlaced) {
// backtrack: remove queen placed earlier
// and try next square in column
removeQueen(row, column);
++row;
} // end if
} // end if
} // end while
return queenPlaced;
} // end if
} // end placeQueens
// -----------------------------------------
private void setQueen(int row, int column) {
board[row][column] = QUEEN;
System.out.println("setQueen - queen placed at Col " + column + " row " + row);
} // end setQueen
// ---------------------------------
private void removeQueen(int row, int column) {
board[row][column] = 0;
System.out.println("removeQueen - queen removed from Col " + column + " row " + row);
return;
} // end removeQueen
// ---------------------------------
private boolean isUnderAttack(int row, int column) {
// check rows and column for attack
for (int i = 0; i < BOARD_SIZE; i++) {
if (board[i][column] == QUEEN)
return true;
}
for (int i = 0; i < BOARD_SIZE; i++) {
if (board[row][i] == QUEEN)
return true;
}
// now check the diagonals
// from position to upper left
int r = row;
int c = column;
while ((r >= 0) && (c >= 0)) {
if (board[r][c] == QUEEN)
return true;
r--;
c--;
}
// from position to lower right
r = row;
c = column; // back to position
while ((r < BOARD_SIZE) && (c < BOARD_SIZE)) {
if (board[r][c] == QUEEN)
return true;
r++;
c++;
}
// from position to upper right
r = row;
c = column; // back to position
while ((r >= 0) && (c < BOARD_SIZE)) {
if (board[r][c] == QUEEN)
return true;
r--;
c++;
}
// from position to lower left
r = row;
c = column; // back to position
while ((r < BOARD_SIZE) && (c >= 0)) {
if (board[r][c] == QUEEN)
return true;
r++;
c--;
}
return false;
} // end isUnderAttack
// --------------------------------static method
public static void main(String[] args) {
Queen q = new Queen();
q.placeQueens(0);
q.displayBoard();
}
// -------------------------------------------
private int index(int number) {
return (number);
} // end index
} // end Queens
Output
placeQueens- trying column 0
setQueen - queen placed at Col 0 row 0
placeQueens- trying column 1
setQueen - queen placed at Col 1 row 2
placeQueens- trying column 2
setQueen - queen placed at Col 2 row 4
placeQueens- trying column 3
setQueen - queen placed at Col 3 row 1
placeQueens- trying column 4
setQueen - queen placed at Col 4 row 3
placeQueens- trying column 5
removeQueen - queen removed from Col 4 row 3
setQueen - queen placed at Col 4 row 7
placeQueens- trying column 5
removeQueen - queen removed from Col 4 row 7
removeQueen - queen removed from Col 3 row 1
setQueen - queen placed at Col 3 row 6
placeQueens- trying column 4
setQueen - queen placed at Col 4 row 1
placeQueens- trying column 5
setQueen - queen placed at Col 5 row 3
placeQueens- trying column 6
setQueen - queen placed at Col 6 row 5
placeQueens- trying column 7
removeQueen - queen removed from Col 6 row 5
removeQueen - queen removed from Col 5 row 3
removeQueen - queen removed from Col 4 row 1
setQueen - queen placed at Col 4 row 3
placeQueens- trying column 5
removeQueen - queen removed from Col 4 row 3
removeQueen - queen removed from Col 3 row 6
setQueen - queen placed at Col 3 row 7
placeQueens- trying column 4
setQueen - queen placed at Col 4 row 1
placeQueens- trying column 5
setQueen - queen placed at Col 5 row 3
placeQueens- trying column 6
setQueen - queen placed at Col 6 row 5
placeQueens- trying column 7
removeQueen - queen removed from Col 6 row 5
removeQueen - queen removed from Col 5 row 3
removeQueen - queen removed from Col 4 row 1
setQueen - queen placed at Col 4 row 3
placeQueens- trying column 5
removeQueen - queen removed from Col 4 row 3
removeQueen - queen removed from Col 3 row 7
removeQueen - queen removed from Col 2 row 4
setQueen - queen placed at Col 2 row 5
placeQueens- trying column 3
setQueen - queen placed at Col 3 row 1
placeQueens- trying column 4
setQueen - queen placed at Col 4 row 6
placeQueens- trying column 5
setQueen - queen placed at Col 5 row 4
placeQueens- trying column 6
removeQueen - queen removed from Col 5 row 4
removeQueen - queen removed from Col 4 row 6
removeQueen - queen removed from Col 3 row 1
setQueen - queen placed at Col 3 row 7
placeQueens- trying column 4
setQueen - queen placed at Col 4 row 1
placeQueens- trying column 5
setQueen - queen placed at Col 5 row 3
placeQueens- trying column 6
removeQueen - queen removed from Col 5 row 3
setQueen - queen placed at Col 5 row 4
placeQueens- trying column 6
removeQueen - queen removed from Col 5 row 4
removeQueen - queen removed from Col 4 row 1
removeQueen - queen removed from Col 3 row 7
removeQueen - queen removed from Col 2 row 5
setQueen - queen placed at Col 2 row 6
placeQueens- trying column 3
setQueen - queen placed at Col 3 row 1
placeQueens- trying column 4
setQueen - queen placed at Col 4 row 3
placeQueens- trying column 5
setQueen - queen placed at Col 5 row 7
placeQueens- trying column 6
removeQueen - queen removed from Col 5 row 7
removeQueen - queen removed from Col 4 row 3
setQueen - queen placed at Col 4 row 7
placeQueens- trying column 5
setQueen - queen placed at Col 5 row 4
placeQueens- trying column 6
removeQueen - queen removed from Col 5 row 4
removeQueen - queen removed from Col 4 row 7
removeQueen - queen removed from Col 3 row 1
removeQueen - queen removed from Col 2 row 6
setQueen - queen placed at Col 2 row 7
placeQueens- trying column 3
setQueen - queen placed at Col 3 row 1
placeQueens- trying column 4
setQueen - queen placed at Col 4 row 3
placeQueens- trying column 5
removeQueen - queen removed from Col 4 row 3
setQueen - queen placed at Col 4 row 6
placeQueens- trying column 5
removeQueen - queen removed from Col 4 row 6
removeQueen - queen removed from Col 3 row 1
setQueen - queen placed at Col 3 row 5
placeQueens- trying column 4
setQueen - queen placed at Col 4 row 1
placeQueens- trying column 5
removeQueen - queen removed from Col 4 row 1
setQueen - queen placed at Col 4 row 3
placeQueens- trying column 5
setQueen - queen placed at Col 5 row 1
placeQueens- trying column 6
setQueen - queen placed at Col 6 row 4
placeQueens- trying column 7
removeQueen - queen removed from Col 6 row 4
removeQueen - queen removed from Col 5 row 1
removeQueen - queen removed from Col 4 row 3
removeQueen - queen removed from Col 3 row 5
removeQueen - queen removed from Col 2 row 7
removeQueen - queen removed from Col 1 row 2
setQueen - queen placed at Col 1 row 3
placeQueens- trying column 2
setQueen - queen placed at Col 2 row 1
placeQueens- trying column 3
setQueen - queen placed at Col 3 row 4
placeQueens- trying column 4
setQueen - queen placed at Col 4 row 2
placeQueens- trying column 5
removeQueen - queen removed from Col 4 row 2
setQueen - queen placed at Col 4 row 7
placeQueens- trying column 5
removeQueen - queen removed from Col 4 row 7
removeQueen - queen removed from Col 3 row 4
setQueen - queen placed at Col 3 row 6
placeQueens- trying column 4
setQueen - queen placed at Col 4 row 2
placeQueens- trying column 5
removeQueen - queen removed from Col 4 row 2
removeQueen - queen removed from Col 3 row 6
setQueen - queen placed at Col 3 row 7
placeQueens- trying column 4
setQueen - queen placed at Col 4 row 2
placeQueens- trying column 5
setQueen - queen placed at Col 5 row 6
placeQueens- trying column 6
removeQueen - queen removed from Col 5 row 6
removeQueen - queen removed from Col 4 row 2
setQueen - queen placed at Col 4 row 5
placeQueens- trying column 5
setQueen - queen placed at Col 5 row 2
placeQueens- trying column 6
removeQueen - queen removed from Col 5 row 2
removeQueen - queen removed from Col 4 row 5
removeQueen - queen removed from Col 3 row 7
removeQueen - queen removed from Col 2 row 1
setQueen - queen placed at Col 2 row 5
placeQueens- trying column 3
setQueen - queen placed at Col 3 row 2
placeQueens- trying column 4
removeQueen - queen removed from Col 3 row 2
setQueen - queen placed at Col 3 row 7
placeQueens- trying column 4
setQueen - queen placed at Col 4 row 1
placeQueens- trying column 5
setQueen - queen placed at Col 5 row 4
placeQueens- trying column 6
setQueen - queen placed at Col 6 row 2
placeQueens- trying column 7
removeQueen - queen removed from Col 6 row 2
removeQueen - queen removed from Col 5 row 4
setQueen - queen placed at Col 5 row 6
placeQueens- trying column 6
setQueen - queen placed at Col 6 row 2
placeQueens- trying column 7
removeQueen - queen removed from Col 6 row 2
removeQueen - queen removed from Col 5 row 6
removeQueen - queen removed from Col 4 row 1
setQueen - queen placed at Col 4 row 2
placeQueens- trying column 5
setQueen - queen placed at Col 5 row 4
placeQueens- trying column 6
removeQueen - queen removed from Col 5 row 4
setQueen - queen placed at Col 5 row 6
placeQueens- trying column 6
removeQueen - queen removed from Col 5 row 6
removeQueen - queen removed from Col 4 row 2
removeQueen - queen removed from Col 3 row 7
removeQueen - queen removed from Col 2 row 5
setQueen - queen placed at Col 2 row 6
placeQueens- trying column 3
setQueen - queen placed at Col 3 row 2
placeQueens- trying column 4
setQueen - queen placed at Col 4 row 5
placeQueens- trying column 5
setQueen - queen placed at Col 5 row 1
placeQueens- trying column 6
setQueen - queen placed at Col 6 row 4
placeQueens- trying column 7
removeQueen - queen removed from Col 6 row 4
removeQueen - queen removed from Col 5 row 1
removeQueen - queen removed from Col 4 row 5
setQueen - queen placed at Col 4 row 7
placeQueens- trying column 5
setQueen - queen placed at Col 5 row 1
placeQueens- trying column 6
setQueen - queen placed at Col 6 row 4
placeQueens- trying column 7
removeQueen - queen removed from Col 6 row 4
removeQueen - queen removed from Col 5 row 1
removeQueen - queen removed from Col 4 row 7
removeQueen - queen removed from Col 3 row 2
setQueen - queen placed at Col 3 row 4
placeQueens- trying column 4
setQueen - queen placed at Col 4 row 1
placeQueens- trying column 5
removeQueen - queen removed from Col 4 row 1
setQueen - queen placed at Col 4 row 2
placeQueens- trying column 5
removeQueen - queen removed from Col 4 row 2
setQueen - queen placed at Col 4 row 7
placeQueens- trying column 5
setQueen - queen placed at Col 5 row 1
placeQueens- trying column 6
removeQueen - queen removed from Col 5 row 1
removeQueen - queen removed from Col 4 row 7
removeQueen - queen removed from Col 3 row 4
removeQueen - queen removed from Col 2 row 6
setQueen - queen placed at Col 2 row 7
placeQueens- trying column 3
setQueen - queen placed at Col 3 row 2
placeQueens- trying column 4
removeQueen - queen removed from Col 3 row 2
setQueen - queen placed at Col 3 row 4
placeQueens- trying column 4
setQueen - queen placed at Col 4 row 1
placeQueens- trying column 5
removeQueen - queen removed from Col 4 row 1
setQueen - queen placed at Col 4 row 2
placeQueens- trying column 5
removeQueen - queen removed from Col 4 row 2
removeQueen - queen removed from Col 3 row 4
removeQueen - queen removed from Col 2 row 7
removeQueen - queen removed from Col 1 row 3
setQueen - queen placed at Col 1 row 4
placeQueens- trying column 2
setQueen - queen placed at Col 2 row 1
placeQueens- trying column 3
setQueen - queen placed at Col 3 row 5
placeQueens- trying column 4
setQueen - queen placed at Col 4 row 2
placeQueens- trying column 5
setQueen - queen placed at Col 5 row 6
placeQueens- trying column 6
setQueen - queen placed at Col 6 row 3
placeQueens- trying column 7
removeQueen - queen removed from Col 6 row 3
removeQueen - queen removed from Col 5 row 6
removeQueen - queen removed from Col 4 row 2
removeQueen - queen removed from Col 3 row 5
setQueen - queen placed at Col 3 row 7
placeQueens- trying column 4
setQueen - queen placed at Col 4 row 2
placeQueens- trying column 5
setQueen - queen placed at Col 5 row 6
placeQueens- trying column 6
setQueen - queen placed at Col 6 row 3
placeQueens- trying column 7
removeQueen - queen removed from Col 6 row 3
removeQueen - queen removed from Col 5 row 6
removeQueen - queen removed from Col 4 row 2
setQueen - queen placed at Col 4 row 5
placeQueens- trying column 5
setQueen - queen placed at Col 5 row 2
placeQueens- trying column 6
removeQueen - queen removed from Col 5 row 2
setQueen - queen placed at Col 5 row 3
placeQueens- trying column 6
removeQueen - queen removed from Col 5 row 3
removeQueen - queen removed from Col 4 row 5
removeQueen - queen removed from Col 3 row 7
removeQueen - queen removed from Col 2 row 1
setQueen - queen placed at Col 2 row 6
placeQueens- trying column 3
setQueen - queen placed at Col 3 row 1
placeQueens- trying column 4
setQueen - queen placed at Col 4 row 3
placeQueens- trying column 5
setQueen - queen placed at Col 5 row 7
placeQueens- trying column 6
removeQueen - queen removed from Col 5 row 7
removeQueen - queen removed from Col 4 row 3
setQueen - queen placed at Col 4 row 5
placeQueens- trying column 5
setQueen - queen placed at Col 5 row 2
placeQueens- trying column 6
removeQueen - queen removed from Col 5 row 2
setQueen - queen placed at Col 5 row 7
placeQueens- trying column 6
removeQueen - queen removed from Col 5 row 7
removeQueen - queen removed from Col 4 row 5
removeQueen - queen removed from Col 3 row 1
removeQueen - queen removed from Col 2 row 6
setQueen - queen placed at Col 2 row 7
placeQueens- trying column 3
setQueen - queen placed at Col 3 row 1
placeQueens- trying column 4
setQueen - queen placed at Col 4 row 3
placeQueens- trying column 5
setQueen - queen placed at Col 5 row 6
placeQueens- trying column 6
setQueen - queen placed at Col 6 row 2
placeQueens- trying column 7
removeQueen - queen removed from Col 6 row 2
removeQueen - queen removed from Col 5 row 6
removeQueen - queen removed from Col 4 row 3
setQueen - queen placed at Col 4 row 6
placeQueens- trying column 5
setQueen - queen placed at Col 5 row 2
placeQueens- trying column 6
setQueen - queen placed at Col 6 row 5
placeQueens- trying column 7
removeQueen - queen removed from Col 6 row 5
removeQueen - queen removed from Col 5 row 2
removeQueen - queen removed from Col 4 row 6
removeQueen - queen removed from Col 3 row 1
setQueen - queen placed at Col 3 row 5
placeQueens- trying column 4
setQueen - queen placed at Col 4 row 2
placeQueens- trying column 5
setQueen - queen placed at Col 5 row 6
placeQueens- trying column 6
setQueen - queen placed at Col 6 row 1
placeQueens- trying column 7
setQueen - queen placed at Col 7 row 3
placeQueens- trying column 8
Queen at row 1 col 1
Queen at row 2 col 7
Queen at row 3 col 5
Queen at row 4 col 8
Queen at row 5 col 2
Queen at row 6 col 4
Queen at row 7 col 6
Queen at row 8 col 3
Q . . . . . . .
. . . . . . Q .
. . . . Q . . .
. . . . . . . Q
. Q . . . . . .
. . . Q . . . .
. . . . . Q . .
. . Q . . . . .
Related Questions
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.