/** * Stores information relevant to solving the n queens problem of placing n * queens on an n-by-n board. * @author Stuart Reges */ public class Board { private int[] board; // stores board info private static final int UNASSIGNED = 100; // unassigned column /** * Constructs an empty size-by-size board. * * @param size the size of the board. * @exception IllegalArgumentException if size is less than 1. */ public Board(int size) { if (size < 0) throw new IllegalArgumentException(); board = new int[size]; for (int i = 0; i < size; i++) board[i] = UNASSIGNED; } /** * Returns true if it is safe to place a queen at position (row, * col). * * @param row of position to check. * @param col column of position to check. * @return true if it is safe to place a queen at position (row, * col). * @exception IllegalArgumentException if row and col do not represent a * legal board position. */ public boolean safe(int row, int col) { // first reset row and col to array range (0..size-1) row--; col--; // next check that row, col are in bounds if (!legal(row, col)) throw new IllegalArgumentException(); // next check that the current column is empty if (board[col] != UNASSIGNED) return false; // now check for conflicts with other columns for (int currCol = 0; currCol < board.length; currCol++) { int distance = col - currCol; // check for diagonal conflict if (board[currCol] == row - distance) return false; // check for conflict in this row if (board[currCol] == row) return false; // check for other diagonal conflict if (board[currCol] == row + distance) return false; } return true; } /** * Places a queen at position (row, col). * * @param row row of position to check. * @param col column of position to check. * @exception IllegalArgumentException if it is not safe to place a queen * at the given position. */ public void place(int row, int col) { if (!safe(row, col)) throw new IllegalArgumentException(); board[col - 1] = row - 1; } /** * Removes the queen at position (row, col). * * @param row row of position to check. * @param col column of position to check. * @exception IllegalArgumentException if there is no queen at the given * position. */ public void remove(int row, int col) { if (!legal(row - 1, col - 1) || board[col - 1] != row - 1) throw new IllegalArgumentException(); board[col - 1] = UNASSIGNED; } /** * Returns the size of the board. * * @return the size of the board. */ public int size() { return board.length; } /** * Displays the current board to System.out. */ public void print() { for (int row = 0; row < board.length; row++) { for (int col = 0; col < board.length; col++) if (board[col] == row) System.out.print(" Q "); else System.out.print(" - "); System.out.println(); } System.out.println(); } /** * returns the row of the queen placed in this column (0-based), returning * UNASSIGNED if no placed queen in the column * * @param col column to check (0-based) */ protected int getQueenRowForColumn(int col) { return board[col]; } // post: returns true iff row and col are legal for this board private boolean legal(int row, int col) { return row >= 0 && row < board.length && col >= 0 && col < board.length; } }