89 lines
3.1 KiB
Java
89 lines
3.1 KiB
Java
//The N Queen is the problem of placing N chess queens on an N×N chessboard so that no two queens attack each other.
|
||
|
||
// Algorithm Type: Backtracking
|
||
// Time Complexity: O(n!)
|
||
|
||
import java.util.*;
|
||
import java.util.Scanner;
|
||
|
||
class nqueen
|
||
{
|
||
//Array to store left diagonal elements to check if queen can be placed in left diagonal
|
||
static int []LeftDiagonal = new int[50];
|
||
|
||
//Array to store right diagonal elements to check if queen can be places in right diagonal
|
||
static int []RightDiagonal = new int[50];
|
||
|
||
//Array to store row-wise elements to check if queen can be placed in row
|
||
static int []cl = new int[50];
|
||
|
||
//Function to return true and print if feasible solution is obtained else return false
|
||
static boolean solveNQueen()
|
||
{
|
||
Scanner sc = new Scanner(System.in);
|
||
System.out.print("Enter the value of N for NxN chess board:\t");
|
||
int n = sc.nextInt();
|
||
int[][] chessBoard = new int[n][n];
|
||
for(int i=0;i<n;i++){
|
||
for(int j=0;j<n;j++){
|
||
chessBoard[i][j]=0;
|
||
}
|
||
}
|
||
|
||
if (NQueen(chessBoard, 0,n) == false)
|
||
{
|
||
System.out.printf("Solution does not exist");
|
||
return false;
|
||
}
|
||
|
||
printChessBoard(chessBoard,n);
|
||
return true;
|
||
}
|
||
//A recursive approach to solve N queens problem
|
||
static boolean NQueen(int chessBoard[][], int column,int N)
|
||
{
|
||
if (column >= N) //If all queens are placed, then return true
|
||
return true;
|
||
|
||
for (int i = 0; i < N; i++) //placing queens in all rows of that particular column
|
||
{
|
||
//Check while placing a queen is not attacked by left and right diagonal elements
|
||
if ((LeftDiagonal[i - column + N - 1] != 1 &&
|
||
RightDiagonal[i + column] != 1) && cl[i] != 1)
|
||
{ //If the above condition is true then place the queen
|
||
chessBoard[i][column] = 1;
|
||
LeftDiagonal[i - column + N - 1] =
|
||
RightDiagonal[i + column] = cl[i] = 1;
|
||
|
||
if (NQueen(chessBoard, column + 1,N))
|
||
return true;
|
||
|
||
//If placing this queen in chessBoard doesn't lead to a correct & safe position then remove queen from chessBoard
|
||
//going back through BACKTRACKING
|
||
chessBoard[i][column] = 0;
|
||
LeftDiagonal[i - column + N - 1] =
|
||
RightDiagonal[i + column] = cl[i] = 0;
|
||
}
|
||
}
|
||
return false; //If queen not placed in any row of this column then return false
|
||
}
|
||
|
||
//Function to print chess board
|
||
static void printChessBoard(int chessBoard[][],int N)
|
||
{
|
||
System.out.printf("\n%d queens can be placed in the following order:\n",N);
|
||
for (int i = 0; i < N; i++)
|
||
{
|
||
for (int j = 0; j < N; j++) {
|
||
System.out.printf(" %d ", chessBoard[i][j]);
|
||
}
|
||
System.out.printf("\n");
|
||
}
|
||
}
|
||
public static void main(String[] args)
|
||
{
|
||
nqueen obj = new nqueen();
|
||
obj.solveNQueen();
|
||
}
|
||
}
|