Question

In: Computer Science

The N-QUEENS PROBLEM Given a chess board having N x N cells, we need to place...

The N-QUEENS PROBLEM

Given a chess board having N x N cells, we need to place N queens in such a way that no queen is attacked by any other queen. A queen can only attack horizontally, vertically and diagonally.

Let’s go at this one step at a time.

let’s place the first Queen at some cell, (I, j) and now the number of unattackable cells are reduced. And now, the number of the Queens to be placed are N – 1.

Now place the next queen at some unattacked cell and this reduces the number of unattacked cells and number of queens to be placed becomes N – 1. You can continue doing this as long as the following conditions hold:

The number of unattacked cells is not 0

The number of queens to be placed is not 0

If the number of Queens placed becomes 0, then we found a solution, but if the number of unattacked cells become 0, then we need to backtrack, i.e., move the last placed queen from its current cell, and place it at some other cell. We can do this recursively. Let’s try this for an N = 4

What did you figure out?

What is the input for this problem?

What is the Output for this problem?

If it is possible to place all N Queens so that no Queen attacks another Queen.

If it is not possible to place all N Queens so that no Queen attacks another Queen.

Solutions

Expert Solution

Yes, the following configuration is possible in a 4 x 4 matrix.

The value 1 indicates the presence of queens.

 0  0  1  0 
 1  0  0  0 
 0  0  0  1 
 0  1  0  0

Following is a c/c++ code :

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++)

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

        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 colum 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;

}

The input and output are given above. Input is taken in the code and output is:

 0  0  1  0 
 1  0  0  0 
 0  0  0  1 
 0  1  0  0

Here, 1 indicates the presence of queens.


Related Solutions

The problem of placing k queens in an n×n chessboard. In this problem, you will be...
The problem of placing k queens in an n×n chessboard. In this problem, you will be considering the problem of placing k knights in a n × n chessboard such that no two knights can attack each other. k is given and k ≤ n2. a) Formulate this problem as a Constraint Satisfaction Problem. What are the variables? b) What is the set of possible values for each variable? c) How are the set of variables constrained?
Suppose that we put 4 rooks on a standard 8 × 8 chess board so that...
Suppose that we put 4 rooks on a standard 8 × 8 chess board so that none of the rooks can capture the others. This means that no two rooks can appear in the same row or column. Furthermore, suppose that we do not put a rook in the upper left corner. How many ways can we do this?
t is N queens problem please complete it //*************************************************************** // D.S. Malik // // This class...
t is N queens problem please complete it //*************************************************************** // D.S. Malik // // This class specifies the functions to solve the n-queens // puzzle. //*************************************************************** class nQueensPuzzle { public: nQueensPuzzle(int queens = 8); //constructor //Postcondition: noOfSolutions = 0; noOfQueens = queens; // queensInRow is a pointer to the array // that store the n-tuple. // If no value is specified for the parameter queens, // the default value, which is 8, is assigned to it. bool canPlaceQueen(int k, int...
I t is N queens problem please complete it //*************************************************************** // D.S. Malik // // This...
I t is N queens problem please complete it //*************************************************************** // D.S. Malik // // This class specifies the functions to solve the n-queens // puzzle. //*************************************************************** class nQueensPuzzle { public: nQueensPuzzle(int queens = 8); //constructor //Postcondition: noOfSolutions = 0; noOfQueens = queens; // queensInRow is a pointer to the array // that store the n-tuple. // If no value is specified for the parameter queens, // the default value, which is 8, is assigned to it. bool canPlaceQueen(int k,...
Use Java GUI to write a chessboard 8 Queens Problem Write a program that can place...
Use Java GUI to write a chessboard 8 Queens Problem Write a program that can place 8 queens in such a manner on an 8 x 8 chessboard that no queens attack each other by being in the same row, column or diagonal.
Divide and conquer problem. Suppose we are given two sorted arrays A[1 . . . n]...
Divide and conquer problem. Suppose we are given two sorted arrays A[1 . . . n] and B[1 . . . n] and an integer k. Describe an algorithm to find the kth smallest element in the union of A and B in O(log n) time. For example, if k = 1, your algorithm should return the smallest element of A ∪ B; if k = n, your algorithm should return the median of A ∪ B.) You can assume...
a) Given X ~N(10, 18)  and n = 64 P(13 < X < 14) = b) Given...
a) Given X ~N(10, 18)  and n = 64 P(13 < X < 14) = b) Given X ~N(10, 18)  and n = 64 x-bar ~ N(10, _________) c) Given X ~N(10, 18)  and n = 64 μ = _____
Given the function N(x)=x^(1.2) + x -ln(x) - 2 Find the roots of N(x) in the...
Given the function N(x)=x^(1.2) + x -ln(x) - 2 Find the roots of N(x) in the domain 0.1 ? x ? 2.5 using the MATLAB fzero function. Plot N(x) using fplot to find the estimates of the roots. Use a for-loop that calls the fzero function and prints the roots to 3 decimal places. Define N(x) using an anonymous function definition, and pass your function using your anonymous function
Given two functions, M(x, y) and N(x, y), suppose that (∂N/∂x − ∂M/∂y)/(M − N) is...
Given two functions, M(x, y) and N(x, y), suppose that (∂N/∂x − ∂M/∂y)/(M − N) is a function of x + y. That is, let f(t) be a function such that f(x + y) = (∂N/∂x − ∂M/∂y)/(M − N) Assume that you can solve the differential equation M dx + N dy = 0 by multiplying by an integrating factor μ that makes it exact and that it can also be written as a function of x + y,...
Section 1: Given a system y[n]-y[n-1]+y[n-2]=x[n] (refer to M3.2 on textbook) In class, we analytically derived...
Section 1: Given a system y[n]-y[n-1]+y[n-2]=x[n] (refer to M3.2 on textbook) In class, we analytically derived the solutions of second order difference equations, including zero-input response, unit impulse response, zero-state response and total response. The Matlab has imbedded commands to do the same job. Get familiar with the following commends, and use them to get (0≤n≤40) a) unit impulse response and plot it b) zero-input response and plot it, with initial conditions of y[-1]=1 and y[-2]=2 c) zero-state response and...
ADVERTISEMENT
ADVERTISEMENT
ADVERTISEMENT