== NQueen2.java == {{{~cpp import java.io.PrintStream; public class NQueen2 { public static final char DEFAULT_BOARD_MARK = '.'; public static final char DEFAULT_QUEEN_MARK = 'Q'; public static final char DEFAULT_LINE_BREAK = '\n'; private int size; private int [] board; private int numberOfAnswers; private boolean checkOne; private int hasAnswer; private char boardMark; private char queenMark; private char lineBreak; private PrintStream out; private NQueen2() {} public NQueen2( int size ) throws Exception { if( size < 1 ) throw new Exception( NQueen2.class.getName() + "- size must be greater than 0." ); this.size = size; board = new int[size]; numberOfAnswers = -1; checkOne = false; hasAnswer = -1; setDefaultOutputFormat(); } public int getSize() { return size; } public void setDefaultOutputFormat() { boardMark = DEFAULT_BOARD_MARK; queenMark = DEFAULT_QUEEN_MARK; lineBreak = DEFAULT_LINE_BREAK; } public void setOutputFormat( final char boardMark, final char queenMark, final char lineBreak ) { this.boardMark = boardMark; this.queenMark = queenMark; this.lineBreak = lineBreak; } public int countAnswers() { return countAnswers( null ); } public int countAnswers( final PrintStream out ) { if( out != null || numberOfAnswers == -1 ) { this.out = out; setQueens(); this.out = null; } return numberOfAnswers; } public boolean hasAnswers() { if( hasAnswer == -1 ) { boolean prevCheckOne = checkOne; checkOne = true; setQueens(); checkOne = prevCheckOne; numberOfAnswers = -1; } if( hasAnswer == 1 ) return true; return false; } private void setQueens() { numberOfAnswers = 0; setQueenAt( 0 ); } private void setQueenAt( int line ) { if( line == size ) { if( isValidQueens() ) { hasAnswer = 1; numberOfAnswers ++; if( out != null ) printQueen(); } return; } for( int xPos=0; xPos 0 ) break; board[line] = xPos; setQueenAt( line + 1 ); } } private boolean isValidQueens() { for( int i=0; i