N Queen Problem - GeeksforGeeks (2024)

Last Updated : 03 Oct, 2023

Improve

We have discussed Knight’s tour and Rat in a Maze problem earlier as examples of Backtracking problems. Let us discuss N Queen as another example problem that can be solved using backtracking.

What is N-Queen problem?

N Queen Problem - GeeksforGeeks (1)

The N Queen is the problem of placing N chess queens on an N×N chessboard so that no two queens attack each other.

For example, the following is a solution for the 4 Queen problem.

N Queen Problem - GeeksforGeeks (2)

The expected output is in the form of a matrix that has ‘Q‘s for the blocks where queens are placed and the empty spaces are represented by ‘.’ . For example, the following is the output matrix for the above 4-Queen solution.

. Q ..
. . . Q
Q . . .
. . Q .

Recommended: Please solve it on “PRACTICE ” first, before moving on to the solution.

N Queen Problem using Backtracking:

The idea is to place queens one by one in different columns, starting from the leftmost column. When we place a queen in a column, we check for clashes with already placed queens. In the current column, if we find a row for which there is no clash, we mark this row and column as part of the solution. If we do not find such a row due to clashes, then we backtrack and return false.

Below is the recursive tree of the above approach:

N Queen Problem - GeeksforGeeks (3)

Recursive tree for N Queen problem

Follow the steps mentioned below to implement the idea:

  • Start in the leftmost column
  • If all queens are placed return true
  • Try all rows in the current column. Do the following for every row.
    • If the queen can be placed safely in this row
      • Then mark this [row, column] as part of the solution and recursively check if placing queen here leads to a solution.
      • If placing the queen in [row, column] leads to a solution then return true.
      • If placing queen doesn’t lead to a solution then unmark this [row, column] then backtrack and try other rows.
    • If all rows have been tried and valid solution is not found return false to trigger backtracking.

For better visualisation of this backtracking approach, please refer 4 Queen problem.

Note: We can also solve this problem by placing queens in rows as well.

Below is the implementation of the above approach:

C++

// C++ program to solve N Queen Problem using backtracking

#include <bits/stdc++.h>

#define N 4

using namespace std;

// A utility function to print solution

void printSolution(int board[N][N])

{

for (int i = 0; i < N; i++) {

for (int j = 0; j < N; j++)

if(board[i][j])

cout << "Q ";

else cout<<". ";

printf("\n");

}

}

// A utility function to check if a queen can

// be placed on board[row][col]. Note that this

// function is called when "col" queens are

// already placed in columns from 0 to col -1.

// So we need to check only left side for

// attacking queens

bool isSafe(int board[N][N], int row, int col)

{

int i, j;

// Check this row on left side

for (i = 0; i < col; i++)

if (board[row][i])

return false;

// Check upper diagonal on left side

for (i = row, j = col; i >= 0 && j >= 0; i--, j--)

if (board[i][j])

return false;

// Check lower diagonal on left side

for (i = row, j = col; j >= 0 && i < N; i++, j--)

if (board[i][j])

return false;

return true;

}

// A recursive utility function to solve N

// Queen problem

bool solveNQUtil(int board[N][N], int col)

{

// base case: If all queens are placed

// then return true

if (col >= N)

return true;

// Consider this column and try placing

// this queen in all rows one by one

for (int i = 0; i < N; i++) {

// Check if the queen can be placed on

// board[i][col]

if (isSafe(board, i, col)) {

// Place this queen in board[i][col]

board[i][col] = 1;

// recur to place rest of the queens

if (solveNQUtil(board, col + 1))

return true;

// If placing queen in board[i][col]

// doesn't lead to a solution, then

// remove queen from board[i][col]

board[i][col] = 0; // BACKTRACK

}

}

// If the queen cannot be placed in any row in

// this column col then return false

return false;

}

// This function solves the N Queen problem using

// Backtracking. It mainly uses solveNQUtil() to

// solve the problem. It returns false if queens

// cannot be placed, otherwise, return true and

// prints placement of queens in the form of 1s.

// Please note that there may be more than one

// solutions, this function prints one of the

// feasible solutions.

bool solveNQ()

{

int board[N][N] = { { 0, 0, 0, 0 },

{ 0, 0, 0, 0 },

{ 0, 0, 0, 0 },

{ 0, 0, 0, 0 } };

if (solveNQUtil(board, 0) == false) {

cout << "Solution does not exist";

return false;

}

printSolution(board);

return true;

}

// Driver program to test above function

int main()

{

solveNQ();

return 0;

}

// This code is contributed by Aditya Kumar (adityakumar129)

C

// C program to solve N Queen Problem using backtracking

#define N 4

#include <stdbool.h>

#include <stdio.h>

// A utility function to print solution

void printSolution(int board[N][N])

{

for (int i = 0; i < N; i++) {

for (int j = 0; j < N; j++) {

if(board[i][j])

printf("Q ");

else

printf(". ");

}

printf("\n");

}

}

// A utility function to check if a queen can

// be placed on board[row][col]. Note that this

// function is called when "col" queens are

// already placed in columns from 0 to col -1.

// So we need to check only left side for

// attacking queens

bool isSafe(int board[N][N], int row, int col)

{

int i, j;

// Check this row on left side

for (i = 0; i < col; i++)

if (board[row][i])

return false;

// Check upper diagonal on left side

for (i = row, j = col; i >= 0 && j >= 0; i--, j--)

if (board[i][j])

return false;

// Check lower diagonal on left side

for (i = row, j = col; j >= 0 && i < N; i++, j--)

if (board[i][j])

return false;

return true;

}

// A recursive utility function to solve N

// Queen problem

bool solveNQUtil(int board[N][N], int col)

{

// Base case: If all queens are placed

// then return true

if (col >= N)

return true;

// Consider this column and try placing

// this queen in all rows one by one

for (int i = 0; i < N; i++) {

// Check if the queen can be placed on

// board[i][col]

if (isSafe(board, i, col)) {

// Place this queen in board[i][col]

board[i][col] = 1;

// Recur to place rest of the queens

if (solveNQUtil(board, col + 1))

return true;

// If placing queen in board[i][col]

// doesn't lead to a solution, then

// remove queen from board[i][col]

board[i][col] = 0; // BACKTRACK

}

}

// If the queen cannot be placed in any row in

// this column col then return false

return false;

}

// This function solves the N Queen problem using

// Backtracking. It mainly uses solveNQUtil() to

// solve the problem. It returns false if queens

// cannot be placed, otherwise, return true and

// prints placement of queens in the form of 1s.

// Please note that there may be more than one

// solutions, this function prints one of the

// feasible solutions.

bool solveNQ()

{

int board[N][N] = { { 0, 0, 0, 0 },

{ 0, 0, 0, 0 },

{ 0, 0, 0, 0 },

{ 0, 0, 0, 0 } };

if (solveNQUtil(board, 0) == false) {

printf("Solution does not exist");

return false;

}

printSolution(board);

return true;

}

// Driver program to test above function

int main()

{

solveNQ();

return 0;

}

// This code is contributed by Aditya Kumar (adityakumar129)

Java

// Java program to solve N Queen Problem using backtracking

public class NQueenProblem {

final int N = 4;

// A utility function to print solution

void printSolution(int board[][])

{

for (int i = 0; i < N; i++) {

for (int j = 0; j < N; j++) {

if (board[i][j] == 1)

System.out.print("Q ");

else

System.out.print(". ");

}

System.out.println();

}

}

// A utility function to check if a queen can

// be placed on board[row][col]. Note that this

// function is called when "col" queens are already

// placeed in columns from 0 to col -1. So we need

// to check only left side for attacking queens

boolean isSafe(int board[][], int row, int col)

{

int i, j;

// Check this row on left side

for (i = 0; i < col; i++)

if (board[row][i] == 1)

return false;

// Check upper diagonal on left side

for (i = row, j = col; i >= 0 && j >= 0; i--, j--)

if (board[i][j] == 1)

return false;

// Check lower diagonal on left side

for (i = row, j = col; j >= 0 && i < N; i++, j--)

if (board[i][j] == 1)

return false;

return true;

}

// A recursive utility function to solve N

// Queen problem

boolean solveNQUtil(int board[][], int col)

{

// Base case: If all queens are placed

// then return true

if (col >= N)

return true;

// Consider this column and try placing

// this queen in all rows one by one

for (int i = 0; i < N; i++) {

// Check if the queen can be placed on

// board[i][col]

if (isSafe(board, i, col)) {

// Place this queen in board[i][col]

board[i][col] = 1;

// Recur to place rest of the queens

if (solveNQUtil(board, col + 1) == true)

return true;

// If placing queen in board[i][col]

// doesn't lead to a solution then

// remove queen from board[i][col]

board[i][col] = 0; // BACKTRACK

}

}

// If the queen can not be placed in any row in

// this column col, then return false

return false;

}

// This function solves the N Queen problem using

// Backtracking. It mainly uses solveNQUtil () to

// solve the problem. It returns false if queens

// cannot be placed, otherwise, return true and

// prints placement of queens in the form of 1s.

// Please note that there may be more than one

// solutions, this function prints one of the

// feasible solutions.

boolean solveNQ()

{

int board[][] = { { 0, 0, 0, 0 },

{ 0, 0, 0, 0 },

{ 0, 0, 0, 0 },

{ 0, 0, 0, 0 } };

if (solveNQUtil(board, 0) == false) {

System.out.print("Solution does not exist");

return false;

}

printSolution(board);

return true;

}

// Driver program to test above function

public static void main(String args[])

{

NQueenProblem Queen = new NQueenProblem();

Queen.solveNQ();

}

}

// This code is contributed by Abhishek Shankhadhar

Python3

# Python3 program to solve N Queen

# Problem using backtracking

global N

N = 4

def printSolution(board):

for i in range(N):

for j in range(N):

if board[i][j] == 1:

print("Q",end=" ")

else:

print(".",end=" ")

print()

# A utility function to check if a queen can

# be placed on board[row][col]. Note that this

# function is called when "col" queens are

# already placed in columns from 0 to col -1.

# So we need to check only left side for

# attacking queens

def isSafe(board, row, col):

# Check this row on left side

for i in range(col):

if board[row][i] == 1:

return False

# Check upper diagonal on left side

for i, j in zip(range(row, -1, -1),

range(col, -1, -1)):

if board[i][j] == 1:

return False

# Check lower diagonal on left side

for i, j in zip(range(row, N, 1),

range(col, -1, -1)):

if board[i][j] == 1:

return False

return True

def solveNQUtil(board, col):

# Base case: If all queens are placed

# then return true

if col >= N:

return True

# Consider this column and try placing

# this queen in all rows one by one

for i in range(N):

if isSafe(board, i, col):

# Place this queen in board[i][col]

board[i][col] = 1

# Recur to place rest of the queens

if solveNQUtil(board, col + 1) == True:

return True

# If placing queen in board[i][col

# doesn't lead to a solution, then

# queen from board[i][col]

board[i][col] = 0

# If the queen can not be placed in any row in

# this column col then return false

return False

# This function solves the N Queen problem using

# Backtracking. It mainly uses solveNQUtil() to

# solve the problem. It returns false if queens

# cannot be placed, otherwise return true and

# placement of queens in the form of 1s.

# note that there may be more than one

# solutions, this function prints one of the

# feasible solutions.

def solveNQ():

board = [[0, 0, 0, 0],

[0, 0, 0, 0],

[0, 0, 0, 0],

[0, 0, 0, 0]]

if solveNQUtil(board, 0) == False:

print("Solution does not exist")

return False

printSolution(board)

return True

# Driver Code

if __name__ == '__main__':

solveNQ()

# This code is contributed by Divyanshu Mehta

C#

// C# program to solve N Queen Problem

// using backtracking

using System;

class GFG

{

readonly int N = 4;

// A utility function to print solution

void printSolution(int [,]board)

{

for (int i = 0; i < N; i++)

{

for (int j = 0; j < N; j++)

{

if (board[i, j] == 1)

Console.Write("Q ");

else

Console.Write(". ");

}

Console.WriteLine();

}

}

// A utility function to check if a queen can

// be placed on board[row,col]. Note that this

// function is called when "col" queens are already

// placeed in columns from 0 to col -1. So we need

// to check only left side for attacking queens

bool isSafe(int [,]board, int row, int col)

{

int i, j;

// Check this row on left side

for (i = 0; i < col; i++)

if (board[row,i] == 1)

return false;

// Check upper diagonal on left side

for (i = row, j = col; i >= 0 &&

j >= 0; i--, j--)

if (board[i,j] == 1)

return false;

// Check lower diagonal on left side

for (i = row, j = col; j >= 0 &&

i < N; i++, j--)

if (board[i, j] == 1)

return false;

return true;

}

// A recursive utility function to solve N

// Queen problem

bool solveNQUtil(int [,]board, int col)

{

// Base case: If all queens are placed

// then return true

if (col >= N)

return true;

// Consider this column and try placing

// this queen in all rows one by one

for (int i = 0; i < N; i++)

{

// Check if the queen can be placed on

// board[i,col]

if (isSafe(board, i, col))

{

// Place this queen in board[i,col]

board[i, col] = 1;

// Recur to place rest of the queens

if (solveNQUtil(board, col + 1) == true)

return true;

// If placing queen in board[i,col]

// doesn't lead to a solution then

// remove queen from board[i,col]

board[i, col] = 0; // BACKTRACK

}

}

// If the queen can not be placed in any row in

// this column col, then return false

return false;

}

// This function solves the N Queen problem using

// Backtracking. It mainly uses solveNQUtil () to

// solve the problem. It returns false if queens

// cannot be placed, otherwise, return true and

// prints placement of queens in the form of 1s.

// Please note that there may be more than one

// solutions, this function prints one of the

// feasible solutions.

bool solveNQ()

{

int [,]board = {{ 0, 0, 0, 0 },

{ 0, 0, 0, 0 },

{ 0, 0, 0, 0 },

{ 0, 0, 0, 0 }};

if (solveNQUtil(board, 0) == false)

{

Console.Write("Solution does not exist");

return false;

}

printSolution(board);

return true;

}

// Driver Code

public static void Main(String []args)

{

GFG Queen = new GFG();

Queen.solveNQ();

}

}

// This code is contributed by Princi Singh

Javascript

<script>

// JavaScript program to solve N Queen

// Problem using backtracking

const N = 4

function printSolution(board)

{

for(let i = 0; i < N; i++)

{

for(let j = 0; j < N; j++)

{

if(board[i][j] == 1)

document.write("Q ")

else

document.write(". ")

}

document.write("</br>")

}

}

// A utility function to check if a queen can

// be placed on board[row][col]. Note that this

// function is called when "col" queens are

// already placed in columns from 0 to col -1.

// So we need to check only left side for

// attacking queens

function isSafe(board, row, col)

{

// Check this row on left side

for(let i = 0; i < col; i++){

if(board[row][i] == 1)

return false

}

// Check upper diagonal on left side

for (i = row, j = col; i >= 0 && j >= 0; i--, j--)

if (board[i][j])

return false

// Check lower diagonal on left side

for (i = row, j = col; j >= 0 && i < N; i++, j--)

if (board[i][j])

return false

return true

}

function solveNQUtil(board, col){

// base case: If all queens are placed

// then return true

if(col >= N)

return true

// Consider this column and try placing

// this queen in all rows one by one

for(let i=0;i<N;i++){

if(isSafe(board, i, col)==true){

// Place this queen in board[i][col]

board[i][col] = 1

// recur to place rest of the queens

if(solveNQUtil(board, col + 1) == true)

return true

// If placing queen in board[i][col

// doesn't lead to a solution, then

// queen from board[i][col]

board[i][col] = 0

}

}

// if the queen can not be placed in any row in

// this column col then return false

return false

}

// This function solves the N Queen problem using

// Backtracking. It mainly uses solveNQUtil() to

// solve the problem. It returns false if queens

// cannot be placed, otherwise return true and

// placement of queens in the form of 1s.

// note that there may be more than one

// solutions, this function prints one of the

// feasible solutions.

function solveNQ(){

let board = [ [0, 0, 0, 0],

[0, 0, 0, 0],

[0, 0, 0, 0],

[0, 0, 0, 0] ]

if(solveNQUtil(board, 0) == false){

document.write("Solution does not exist")

return false

}

printSolution(board)

return true

}

// Driver Code

solveNQ()

// This code is contributed by shinjanpatra

</script>

Output

. . Q . Q . . . . . . Q . Q . . 

Time Complexity: O(N!)
Auxiliary Space: O(N2)

Further Optimization in is_safe() function:

The idea is not to check every element in the right and left diagonal, instead use the property of diagonals:

  • The sum of i and j is constant and unique for each right diagonal, where i is the row of elements and j is the
    column of elements.
  • The difference between i and j is constant and unique for each left diagonal, where i and j are row and column of element respectively.

Below is the implementation:

C++

// C++ program to solve N Queen Problem using backtracking

#include <bits/stdc++.h>

using namespace std;

#define N 4

// ld is an array where its indices indicate row-col+N-1

// (N-1) is for shifting the difference to store negative

// indices

int ld[30] = { 0 };

// rd is an array where its indices indicate row+col

// and used to check whether a queen can be placed on

// right diagonal or not

int rd[30] = { 0 };

// Column array where its indices indicates column and

// used to check whether a queen can be placed in that

// row or not*/

int cl[30] = { 0 };

// A utility function to print solution

void printSolution(int board[N][N])

{

for (int i = 0; i < N; i++) {

for (int j = 0; j < N; j++)

cout << " " << (board[i][j]==1?"Q":".") << " ";

cout << endl;

}

}

// A recursive utility function to solve N

// Queen problem

bool solveNQUtil(int board[N][N], int col)

{

// Base case: If all queens are placed

// then return true

if (col >= N)

return true;

// Consider this column and try placing

// this queen in all rows one by one

for (int i = 0; i < N; i++) {

// Check if the queen can be placed on

// board[i][col]

// To check if a queen can be placed on

// board[row][col].We just need to check

// ld[row-col+n-1] and rd[row+coln] where

// ld and rd are for left and right

// diagonal respectively

if ((ld[i - col + N - 1] != 1 && rd[i + col] != 1)

&& cl[i] != 1) {

// Place this queen in board[i][col]

board[i][col] = 1;

ld[i - col + N - 1] = rd[i + col] = cl[i] = 1;

// Recur to place rest of the queens

if (solveNQUtil(board, col + 1))

return true;

// If placing queen in board[i][col]

// doesn't lead to a solution, then

// remove queen from board[i][col]

board[i][col] = 0; // BACKTRACK

ld[i - col + N - 1] = rd[i + col] = cl[i] = 0;

}

}

// If the queen cannot be placed in any row in

// this column col then return false

return false;

}

// This function solves the N Queen problem using

// Backtracking. It mainly uses solveNQUtil() to

// solve the problem. It returns false if queens

// cannot be placed, otherwise, return true and

// prints placement of queens in the form of 1s.

// Please note that there may be more than one

// solutions, this function prints one of the

// feasible solutions.

bool solveNQ()

{

int board[N][N] = { { 0, 0, 0, 0 },

{ 0, 0, 0, 0 },

{ 0, 0, 0, 0 },

{ 0, 0, 0, 0 } };

if (solveNQUtil(board, 0) == false) {

cout << "Solution does not exist";

return false;

}

printSolution(board);

return true;

}

// Driver program to test above function

int main()

{

solveNQ();

return 0;

}

// This code is contributed by Aditya Kumar (adityakumar129)

Java

// Java program to solve N Queen Problem using backtracking

import java.util.*;

class GFG {

static int N = 4;

// ld is an array where its indices indicate row-col+N-1

// (N-1) is for shifting the difference to store

// negative indices

static int[] ld = new int[30];

// rd is an array where its indices indicate row+col

// and used to check whether a queen can be placed on

// right diagonal or not

static int[] rd = new int[30];

// Column array where its indices indicates column and

// used to check whether a queen can be placed in that

// row or not

static int[] cl = new int[30];

// A utility function to print solution

static void printSolution(int board[][])

{

for (int i = 0; i < N; i++) {

for (int j = 0; j < N; j++)

System.out.printf(" %d ", board[i][j]);

System.out.printf("\n");

}

}

// A recursive utility function to solve N

// Queen problem

static boolean solveNQUtil(int board[][], int col)

{

// Base case: If all queens are placed

// then return true

if (col >= N)

return true;

// Consider this column and try placing

// this queen in all rows one by one

for (int i = 0; i < N; i++) {

// Check if the queen can be placed on

// board[i][col]

// To check if a queen can be placed on

// board[row][col].We just need to check

// ld[row-col+n-1] and rd[row+coln] where

// ld and rd are for left and right

// diagonal respectively

if ((ld[i - col + N - 1] != 1

&& rd[i + col] != 1)

&& cl[i] != 1) {

// Place this queen in board[i][col]

board[i][col] = 1;

ld[i - col + N - 1] = rd[i + col] = cl[i]

= 1;

// Recur to place rest of the queens

if (solveNQUtil(board, col + 1))

return true;

// If placing queen in board[i][col]

// doesn't lead to a solution, then

// remove queen from board[i][col]

board[i][col] = 0; // BACKTRACK

ld[i - col + N - 1] = rd[i + col] = cl[i]

= 0;

}

}

// If the queen cannot be placed in any row in

// this column col then return false

return false;

}

// This function solves the N Queen problem using

// Backtracking. It mainly uses solveNQUtil() to

// solve the problem. It returns false if queens

// cannot be placed, otherwise, return true and

// prints placement of queens in the form of 1s.

// Please note that there may be more than one

// solutions, this function prints one of the

// feasible solutions.

static boolean solveNQ()

{

int board[][] = { { 0, 0, 0, 0 },

{ 0, 0, 0, 0 },

{ 0, 0, 0, 0 },

{ 0, 0, 0, 0 } };

if (solveNQUtil(board, 0) == false) {

System.out.printf("Solution does not exist");

return false;

}

printSolution(board);

return true;

}

// Driver Code

public static void main(String[] args)

{

solveNQ();

}

}

// This code is contributed by Princi Singh

Python3

# Python3 program to solve N Queen Problem using

# backtracking

N = 4

# ld is an array where its indices indicate row-col+N-1

# (N-1) is for shifting the difference to store negative

# indices

ld = [0] * 30

# rd is an array where its indices indicate row+col

# and used to check whether a queen can be placed on

# right diagonal or not

rd = [0] * 30

# Column array where its indices indicates column and

# used to check whether a queen can be placed in that

# row or not

cl = [0] * 30

# A utility function to print solution

def printSolution(board):

for i in range(N):

for j in range(N):

print(board[i][j], end=" ")

print()

# A recursive utility function to solve N

# Queen problem

def solveNQUtil(board, col):

# Base case: If all queens are placed

# then return True

if (col >= N):

return True

# Consider this column and try placing

# this queen in all rows one by one

for i in range(N):

# Check if the queen can be placed on board[i][col]

# To check if a queen can be placed on

# board[row][col] We just need to check

# ld[row-col+n-1] and rd[row+coln]

# where ld and rd are for left and

# right diagonal respectively

if ((ld[i - col + N - 1] != 1 and

rd[i + col] != 1) and cl[i] != 1):

# Place this queen in board[i][col]

board[i][col] = 1

ld[i - col + N - 1] = rd[i + col] = cl[i] = 1

# Recur to place rest of the queens

if (solveNQUtil(board, col + 1)):

return True

# If placing queen in board[i][col]

# doesn't lead to a solution,

# then remove queen from board[i][col]

board[i][col] = 0 # BACKTRACK

ld[i - col + N - 1] = rd[i + col] = cl[i] = 0

# If the queen cannot be placed in

# any row in this column col then return False

return False

# This function solves the N Queen problem using

# Backtracking. It mainly uses solveNQUtil() to

# solve the problem. It returns False if queens

# cannot be placed, otherwise, return True and

# prints placement of queens in the form of 1s.

# Please note that there may be more than one

# solutions, this function prints one of the

# feasible solutions.

def solveNQ():

board = [[0, 0, 0, 0],

[0, 0, 0, 0],

[0, 0, 0, 0],

[0, 0, 0, 0]]

if (solveNQUtil(board, 0) == False):

printf("Solution does not exist")

return False

printSolution(board)

return True

# Driver Code

if __name__ == '__main__':

solveNQ()

# This code is contributed by SHUBHAMSINGH10

C#

// C# program to solve N Queen Problem using backtracking

using System;

class GFG {

static int N = 4;

// ld is an array where its indices indicate row-col+N-1

// (N-1) is for shifting the difference to store

// negative indices

static int[] ld = new int[30];

// rd is an array where its indices indicate row+col

// and used to check whether a queen can be placed on

// right diagonal or not

static int[] rd = new int[30];

// Column array where its indices indicates column and

// used to check whether a queen can be placed in that

// row or not

static int[] cl = new int[30];

// A utility function to print solution

static void printSolution(int[, ] board)

{

for (int i = 0; i < N; i++) {

for (int j = 0; j < N; j++)

Console.Write(" {0} ", board[i, j]);

Console.Write("\n");

}

}

// A recursive utility function to solve N

// Queen problem

static bool solveNQUtil(int[, ] board, int col)

{

// Base case: If all queens are placed

// then return true

if (col >= N)

return true;

// Consider this column and try placing

// this queen in all rows one by one

for (int i = 0; i < N; i++) {

// Check if the queen can be placed on

// board[i,col]

// To check if a queen can be placed on

// board[row,col].We just need to check

// ld[row-col+n-1] and rd[row+coln] where

// ld and rd are for left and right

// diagonal respectively

if ((ld[i - col + N - 1] != 1

&& rd[i + col] != 1)

&& cl[i] != 1) {

// Place this queen in board[i,col]

board[i, col] = 1;

ld[i - col + N - 1] = rd[i + col] = cl[i]

= 1;

// Recur to place rest of the queens

if (solveNQUtil(board, col + 1))

return true;

// If placing queen in board[i,col]

// doesn't lead to a solution, then

// remove queen from board[i,col]

board[i, col] = 0; // BACKTRACK

ld[i - col + N - 1] = rd[i + col] = cl[i]

= 0;

}

}

// If the queen cannot be placed in any row in

// this column col then return false

return false;

}

// This function solves the N Queen problem using

// Backtracking. It mainly uses solveNQUtil() to

// solve the problem. It returns false if queens

// cannot be placed, otherwise, return true and

// prints placement of queens in the form of 1s.

// Please note that there may be more than one

// solutions, this function prints one of the

// feasible solutions.

static bool solveNQ()

{

int[, ] board = { { 0, 0, 0, 0 },

{ 0, 0, 0, 0 },

{ 0, 0, 0, 0 },

{ 0, 0, 0, 0 } };

if (solveNQUtil(board, 0) == false) {

Console.Write("Solution does not exist");

return false;

}

printSolution(board);

return true;

}

// Driver Code

public static void Main(String[] args)

{

solveNQ();

}

}

// This code is contributed by Rajput-Ji

Javascript

<script>

// JavaScript code to implement the approach

let N = 4;

// ld is an array where its indices indicate row-col+N-1

// (N-1) is for shifting the difference to store negative

// indices

let ld = new Array(30);

// rd is an array where its indices indicate row+col

// and used to check whether a queen can be placed on

// right diagonal or not

let rd = new Array(30);

// Column array where its indices indicates column and

// used to check whether a queen can be placed in that

// row or not

let cl = new Array(30);

// A utility function to print solution

function printSolution( board)

{

for (let i = 0; i < N; i++)

{

for (let j = 0; j < N; j++)

document.write(board[i][j] + " ");

document.write("<br/>");

}

}

// A recursive utility function to solve N

// Queen problem

function solveNQUtil(board, col)

{

// Base case: If all queens are placed

// then return true

if (col >= N)

return true;

// Consider this column and try placing

// this queen in all rows one by one

for (let i = 0; i < N; i++)

{

// Check if the queen can be placed on

// board[i][col]

// To check if a queen can be placed on

// board[row][col].We just need to check

// ld[row-col+n-1] and rd[row+coln] where

// ld and rd are for left and right

// diagonal respectively

if ((ld[i - col + N - 1] != 1 &&

rd[i + col] != 1) && cl[i] != 1)

{

// Place this queen in board[i][col]

board[i][col] = 1;

ld[i - col + N - 1] =

rd[i + col] = cl[i] = 1;

// Recur to place rest of the queens

if (solveNQUtil(board, col + 1))

return true;

// If placing queen in board[i][col]

// doesn't lead to a solution, then

// remove queen from board[i][col]

board[i][col] = 0; // BACKTRACK

ld[i - col + N - 1] =

rd[i + col] = cl[i] = 0;

}

}

// If the queen cannot be placed in any row in

// this column col then return false

return false;

}

// This function solves the N Queen problem using

// Backtracking. It mainly uses solveNQUtil() to

// solve the problem. It returns false if queens

// cannot be placed, otherwise, return true and

// prints placement of queens in the form of 1s.

// Please note that there may be more than one

// solutions, this function prints one of the

// feasible solutions.

function solveNQ()

{

let board = [[ 0, 0, 0, 0 ],

[ 0, 0, 0, 0 ],

[ 0, 0, 0, 0 ],

[ 0, 0, 0, 0 ]];

if (solveNQUtil(board, 0) == false)

{

document.write("Solution does not exist");

return false;

}

printSolution(board);

return true;

}

// Driver code

solveNQ();

// This code is contributed by sanjoy_62.

</script>

Output

 . . Q . Q . . . . . . Q . Q . . 

Time Complexity: O(N!)
Auxiliary Space: O(N)

Related Articles:

  • Printing all solutions in N-Queen Problem


`; tags.map((tag)=>{ let tag_url = `videos/${getTermType(tag['term_id__term_type'])}/${tag['term_id__slug']}/`; tagContent+=``+ tag['term_id__term_name'] +``; }); tagContent+=`
N Queen Problem - GeeksforGeeks (2024)

FAQs

What is the best way to solve N Queen problem? ›

Solution to the N-Queens Problem

The way we try to solve this is by placing a queen at a position and trying to rule out the possibility of it being under attack. We place one queen in each row/column. If we see that the queen is under attack at its chosen position, we try the next position.

Is n queens a hard problem? ›

N-Queens has long been known to polynomial time (although there is no known efficient way of counting the total number of solutions). We showed N-Queens completion is NP-hard.

How many solutions are there for the N-queen problem? ›

The eight queens puzzle is the problem of placing eight chess queens on an 8×8 chessboard so that no two queens threaten each other; thus, a solution requires that no two queens share the same row, column, or diagonal. There are 92 solutions. The problem was first posed in the mid-19th century.

What is the N queen problem in Hackerrank? ›

The n-queen puzzle is a problem of placing n queens on a(n×n) chessboard. In such a way, that no two queens can attack each other. Given an integer n, find all the distinct solutions to this "n-queen puzzle". Each solution contains distinct board configurations of the n-queens placement.

Which strategy is used to solve the N-Queen problem? ›

The N-Queens problem is a classic puzzle. Its logic involves placing N chess queens on an N×N chessboard, so that no two queens threaten each other. It's a constraint satisfaction problem commonly solved using backtracking algorithms.

Which algorithm is used to solve n-queens problem? ›

N Queen Problem using Backtracking:

In the current column, if we find a row for which there is no clash, we mark this row and column as part of the solution. If we do not find such a row due to clashes, then we backtrack and return false. Try all rows in the current column.

Is n-queens problem NP-Complete? ›

The n- Queens Completion problem is a variant, dating to 1850, in which some queens are already placed and the solver is asked to place the rest, if possi- ble. We show that n-Queens Completion is both NP-Complete and #P-Complete.

What is a good GPA for queens? ›

Students are expected to maintain a cumulative GPA of 1.60 or above to remain in good academic standing. Students who fail to achieve the following cumulative GPA standards when they are evaluated in May of each year may receive an academic sanction.

What is the 52 n queens? ›

Problem Description

The n-queens puzzle is a classic problem in computer science and math that involves placing 'n' queens on an 'n x n' chessboard in such a way that no two queens can attack each other. This means that no two queens can be in the same row, column, or diagonal.

What is the complexity of N-Queen problem? ›

Since the function queen iterates n times and for each iteration it calls the function place(row) function the total time complexity would be O(N^2). So we can conclude that the time complexity of N Queens Algorithm is O(n!)

What is the objective of the N-Queen problem? ›

The N Queen is the problem of placing N chess queens on an N×N chessboard so that no two queens attack each other. For example, the following is a solution for 8 Queen problem.

Why is backtracking used in the n-queens problem? ›

The backtracking algorithm is used to solve the N queen problem, in which the board is recursively filled with queens, one at a time, and backtracked if no valid solution is found. At each step, the algorithm checks to see if the newly placed queen conflicts with any previously placed queens, and if so, it backtracks.

Does HackerRank prevent cheating? ›

For further information, see How to Check for Suspicious Activity Using the AI-Powered Plagiarism Detection Solution. HackerRank ensures that the solution should be candidate first and candidates are not penalized unnecessarily, and at the same time, suspicious candidates are captured reliably.

What is the N-queen problem in artificial intelligence? ›

N-Queen problem is a classical problem in the field of Artificial Intelligence, where we try to find a chessboard configuration where in a N × N board there will be N queens, not attacking each other. There are different ways to address this problem, each having own time complexity.

What is the 4 queens problem? ›

The 4-queens problem consists of a 4x4 chessboard with 4 queens. The goal is to place the 4 queens on the chessboard such that no two queens can attack each other. Each queen attacks anything in the same row, in the same column, or in the same diagonal. Formulate the state of the 4-queens problem below.

What is the best time complexity for the N-Queen problem? ›

Time Complexity - O(N!) For the first row, we check N columns; for the second row, we check the N - 1 column and so on. Hence, the time complexity will be N * (N-1) * (N-2) …. i.e. O(N!)

Which of the following methods can be used to solve and queens problem? ›

Which of the following methods can be used to solve n-queen's problem? Explanation: Of the following given approaches, n-queens problem can be solved using backtracking. It can also be solved using branch and bound.

What is the best algorithm for the 8 queens problem? ›

The algorithm starts by placing a queen on the first column, then it proceeds to the next column and places a queen in the first safe row of that column. If the algorithm reaches the 8th column and all queens are placed in a safe position, it prints the board and returns true.

How does the backtracking technique help in efficiently solving the N-Queen problem? ›

The backtracking algorithm places queens column-by-column, checking for valid placements and backtracking when it reaches an invalid configuration. The time complexity increases exponentially with board size N as the number of possible solutions grows.

Top Articles
Latest Posts
Article information

Author: Tyson Zemlak

Last Updated:

Views: 5958

Rating: 4.2 / 5 (63 voted)

Reviews: 86% of readers found this page helpful

Author information

Name: Tyson Zemlak

Birthday: 1992-03-17

Address: Apt. 662 96191 Quigley Dam, Kubview, MA 42013

Phone: +441678032891

Job: Community-Services Orchestrator

Hobby: Coffee roasting, Calligraphy, Metalworking, Fashion, Vehicle restoration, Shopping, Photography

Introduction: My name is Tyson Zemlak, I am a excited, light, sparkling, super, open, fair, magnificent person who loves writing and wants to share my knowledge and understanding with you.