~cpp
public class NQueen
{
public static final char BLANK_BOARD = '.';
public static final char QUEEN_MARK = 'Q';
private int numberOfBoard;
private int sizeOfBoard;
private int [] board;
private NQueen() {}
public NQueen( int sizeOfBoard )
{
this.sizeOfBoard = sizeOfBoard;
board = new int[sizeOfBoard];
numberOfBoard = 0;
}
protected void initBoard()
{
initBoard( 0 );
}
protected void initBoard( int from )
{
for(int i=from; i<sizeOfBoard; i++ ) board[i] = -1;
}
public void findPosition()
{
initBoard();
setLinePosition( 0 );
}
private void setLinePosition( int line )
{
if( line == sizeOfBoard ) {
if( checkRuleSet() ) {
numberOfBoard ++;
//printBoard();
//System.exit( 0 );
}
initBoard( line-1 );
return;
}
for( int i=0; i<sizeOfBoard; i++ ) {
board[line] = i;
setLinePosition( line + 1 );
}
}
private boolean checkRuleSet()
{
for( int i=0; i<sizeOfBoard; i++ ) {
if( ! checkRule( board[i], i )) return false;
}
return true;
}
private boolean checkRule( int x, int y )
{
int rightDownWay = x - y;
int leftDownWay = x + y;
for( int i=0; i<sizeOfBoard; i++ ) {
if( y != i ) {
if( board[i] == x || board[i] == rightDownWay || board[i] == leftDownWay ) return false;
}
rightDownWay ++;
leftDownWay --;
}
return true;
}
private void printBoard()
{
for( int i=0; i<sizeOfBoard; i++ ) {
for( int j=0; j<sizeOfBoard; j++ ) {
if( board[i] == j ) System.out.print( QUEEN_MARK );
else System.out.print( BLANK_BOARD );
}
System.out.println();
}
}
public void printNumberOfBoard()
{
System.out.println( "Number of different board: " + numberOfBoard );
}
public static void main( String [] args )
{
try {
if( args.length != 1 ) throw new Exception();
NQueen nq = new NQueen( Integer.parseInt( args[0] ));
nq.findPosition();
nq.printNumberOfBoard();
}
catch( Exception e ) {
System.out.println( "Usage: java NQueen size_of_queen" );
}
}
}