~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<size; xPos++ ) {
if( checkOne && numberOfAnswers > 0 ) break;
board[line] = xPos;
setQueenAt( line + 1 );
}
}
private boolean isValidQueens()
{
for( int i=0; i<size; i++ )
if( ! checkRule( i, board[i] )) return false;
return true;
}
private boolean checkRule( final int line, int xPos )
{
int rightDownWay = xPos - line;
int leftDownWay = xPos + line;
for( int i=0; i<size; i++ ) {
if( line != i )
if( board[i] == xPos || board[i] == rightDownWay || board[i] == leftDownWay ) return false;
rightDownWay ++;
leftDownWay --;
}
return true;
}
private void printQueen()
{
for( int i=0; i<size; i++ ) {
for( int j=0; j<size; j++ ) {
if( board[i] == j ) out.print( queenMark );
else out.print( boardMark );
}
out.print( lineBreak );
}
}
public static void main( String [] args )
{
int sizeOfBoard = 0;
try {
if( args.length != 1 ) throw new Exception();
sizeOfBoard = Integer.parseInt( args[0] );
}
catch( Exception e ) {
System.out.println( "Usage: java NQueen2 size" );
System.exit( 1 );
}
try {
NQueen2 nq = new NQueen2( sizeOfBoard );
System.out.println( "has answers? " + nq.hasAnswers() );
System.out.println( "number of answers: " + nq.countAnswers());
System.out.println( "has answers? " + nq.hasAnswers() );
System.out.println( "number of answers: " + nq.countAnswers( System.out ));
nq.setOutputFormat( '-','q','\n' );
System.out.println( "number of answers: " + nq.countAnswers( System.out ));
}
catch( Exception e ) {
e.printStackTrace();
}
}
}