DSA/algorithms/Java/backtracking/nqueen.java

89 lines
3.1 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

//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();
}
}