Know a bit about the Queen piece in a game of Chess
A solution for the “8 queens” problem

Numberphile video:
You can have access to all the Lynda.com resources with your own Princeton Public Library card.

The problem: Design and implement a recursive program that solves the Non- Attacking Queens problem. That is, write a program to determine how eight queens can be positioned on an eight-by-eight chessboard so that none of them are in the same row, column, or diagonal as any other queen. There are no other chess pieces on the board.
Assignment:
If you already implemented the solution to the problem, answer the following questions:
- How does your implementation compare to the one below?
- Is your implementation better than this one?
- What is the time complexity (for now we can say the big-O notation)?
If you have not implemented yet, do the following:
- Trace the code for 4 queens. It only has 2 solutions but 1 unique.
- Explain how the implementation works
- What is the time complexity (for now we can say the big-O notation)?

//********************************************************************
//
// A recursive program that solves the Non-attacking Queens problem.
//********************************************************************
public class NonAttackingQueens {
int[] queens; // Queen i is always placed in row i. The
// column is variable.
// queens[i] represents the column of the ith row
// where the ith queen is
final int NUM_QUEENS = 8;
public NonAttackingQueens()
{
queens = new int[NUM_QUEENS];
}
//-----------------------------------------------------------------
// Returns true if a queen queenNumber can be placed in column
//-----------------------------------------------------------------
boolean canPlace(int queenNumber, int column)
{
for (int row = 0; row < queenNumber; row++) // check all rows above queenNumber row
{
if (queens[row] == column) // in the same column
return false;
if (Math.abs(queens[row] - column) == Math.abs(row - queenNumber)) // same diagonal
return false;
}
return true;
}
//-----------------------------------------------------------------
// Starting with the row represented by queenNumber, find all correct
// placements in the row and below the row.
//-----------------------------------------------------------------
public void solve(int queenNumber)
{
for (int column = 0; column < NUM_QUEENS; column++) // iterate through all columns
{
if (canPlace(queenNumber, column)) // queen can be placed in current column
{
queens[queenNumber] = column; // place queen in current column
if (queenNumber + 1 >= NUM_QUEENS) // solved
printSolution();
else // keep looking
solve(queenNumber + 1);
}
}
}
//-----------------------------------------------------------------
// Computes and displays all solutions to the problem
//-----------------------------------------------------------------
public void showSolutions()
{
solve(0); // start with the first row
}
//-----------------------------------------------------------------
// Prints a grid showing the position of the queens on the chessboard.
// Queen = X
// Empty space = O
//-----------------------------------------------------------------
private void printSolution()
{
int column;
for (int row=0; row<num_queens; row++)="" {="" for="" (column="0;" column<num_queens;="" column++)="" if="" (queens[row]="=" column)="" system.out.print("="" x");="" else="" 0");="" system.out.print("\n");="" }="" system.out.println("\n-----------------------");="" public="" static="" void="" main="" (string="" args[])="" new="" nonattackingqueens().showsolutions();="" <="" pre=""></num_queens;>

