public class Queens { // squares per row or column public static final int BOARD
ID: 3542107 • Letter: P
Question
public class Queens {
// 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;
private int board[][]; // chess board
public Queens() {
// -------------------------------------------------
// Constructor: Creates an empty square board.
// -------------------------------------------------
board = new int[BOARD_SIZE][BOARD_SIZE];
} // end constructor
public void clearBoard() {
// -------------------------------------------------
// Clears the board.
// Precondition: None.
// Postcondition: Sets all squares to EMPTY.
// -------------------------------------------------
for(int i = 0 ; i < BOARD_SIZE; i++){
for(int j = 0; j < BOARD_SIZE;j++){
board[i][j] = EMPTY;
}
}
// To be implemented in Programming Problem 1
} // end clearBoard
public void displayBoard() {
// -------------------------------------------------
// Displays the board.
// Precondition: None.
// Postcondition: Board is written to standard
// output; zero is an EMPTY square, one is a square
// containing a queen (QUEEN).
// -------------------------------------------------
for (int i = 0; i < BOARD_SIZE; i++){
System.out.println("");
for (int j = 0; j <BOARD_SIZE; j++){
System.out.print(board [i][j] + " ");
}
}
// To be implemented in Programming Problem 1
} // end displayBoard
public boolean placeQueens(int column) {
// -------------------------------------------------
// Places queens in columns of the board beginning
// at the column specified.
// Precondition: Queens are placed correctly in
// columns 1 through column-1.
// Postcondition: If a solution is found, each
// column of the board contains one queen and method
// returns true; otherwise, returns false (no
// solution exists for a queen anywhere in column
// specified).
// -------------------------------------------------
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) {
// --------------------------------------------------
// Sets a queen at square indicated by row and
// column.
// Precondition: None.
// Postcondition: Sets the square on the board in a
// given row and column to QUEEN.
// --------------------------------------------------
board[row][column] = QUEEN;
} // end setQueen
private void removeQueen(int row, int column) {
// --------------------------------------------------
// Removes a queen at square indicated by row and
// column.
// Precondition: None.
// Postcondition: Sets the square on the board in a
// given row and column to EMPTY.
// --------------------------------------------------
board[row][column] = EMPTY;
} // end removeQueen
private boolean isUnderAttack(int row, int column) {
// --------------------------------------------------
// Determines whether the square on the board at a
// given row and column is under attack by any queens
// in the columns 1 through column-1.
// Precondition: Each column between 1 and column-1
// has a queen placed in a square at a specific row.
// None of these queens can be attacked by any other
// queen.
// Postcondition: If the designated square is under
// attack, returns true; otherwise, returns false.
// --------------------------------------------------
int r,c;
// r = i
// c = j
// check row
for(c = 0; c < BOARD_SIZE; c++ )
if(board[row][c] == QUEEN)
return true;;
// Check column
for(r = 0;r < BOARD_SIZE; r++)
if(board[r][column] == QUEEN)
return true;
// right down diagonal
for( r = row, c = column; r < BOARD_SIZE && c < BOARD_SIZE; r++, c++)
if(board[r][c] == QUEEN)
return true;
// right up and left
for(r = row, c = column; r >= 0 && c >= 0; r--,c--)
if(board[r][c] == QUEEN)
return true;
// right up and right
for(r = row, c = column; r >= 0 && c < BOARD_SIZE; r--,c++)
if(board[r][c] == QUEEN)
return true;
// right diagonal down and left
for(r = row, c = column; r < BOARD_SIZE && c >= 0; r++,c--)
if(board[r][c] == QUEEN)
return true;
return false;
} // end isUnderAttack
private int index(int number) {
return 0;
// --------------------------------------------------
// Returns the array index that corresponds to
// a row or column number.
// Precondition: 1 <= number <= BOARD_SIZE.
// Postcondition: Returns adjusted index value.
// --------------------------------------------------
// To be implemented in Programming Problem 1
}
public static void main(String[] args) {
Queens main = new Queens();
main.placeQueens(0);
main.displayBoard();
}
} // end index
// end Queens
Explanation / Answer
Deadline for this assignment ?
Related Questions
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.