N Queens Puzzle - Amazon Top Interview Questions


Problem Statement :


The n queens puzzle asks to place n queens on an n×n chessboard so that no two queens are attacking each other.

Given a partially filled two-dimensional integer matrix where 1 represents a queen and 0 represents an empty cell, return whether this configuration of the board can solve the puzzle.

Constraints

1 ≤ n ≤ 15

Example 1

Input

matrix = [
    [1, 0, 0, 0, 0],
    [0, 0, 0, 0, 0],
    [0, 0, 0, 0, 1],
    [0, 0, 0, 0, 0],
    [0, 0, 0, 1, 0]
]

Output

True

Explanation

One solution is:

[1, 0, 0, 0, 0]
[0, 0, 1, 0, 0]
[0, 0, 0, 0, 1]
[0, 1, 0, 0, 0]
[0, 0, 0, 1, 0]



Solution :



title-img




                        Solution in C++ :

int N;
bool canPlace(vector<vector<int>>& matrix, int row, int col) {
    for (int i = 0; i < N; ++i) {
        if (matrix[i][col] or matrix[row][i]) return false;
    }
    int x = row, y = col;
    while (x >= 0 and y >= 0) {
        if (matrix[x--][y--]) return false;
    }
    x = row, y = col;
    while (x >= 0 and y < N) {
        if (matrix[x--][y++]) return false;
    }
    x = row, y = col;
    while (x < N and y >= 0) {
        if (matrix[x++][y--]) return false;
    }
    x = row, y = col;
    while (x < N and y < N) {
        if (matrix[x++][y++]) return false;
    }
    return true;
}
bool alreadyFilled(vector<vector<int>>& matrix, int row) {
    for (int j = 0; j < N; ++j) {
        if (matrix[row][j]) return true;
    }
    return false;
}
bool nQueen(vector<vector<int>>& matrix, int row) {
    if (row == N) {
        return true;
    }
    if (alreadyFilled(matrix, row)) return nQueen(matrix, row + 1);
    for (int j = 0; j < N; ++j) {
        if (canPlace(matrix, row, j)) {
            matrix[row][j] = 1;
            if (nQueen(matrix, row + 1)) return true;
            matrix[row][j] = 0;
        }
    }
    return false;
}
bool solve(vector<vector<int>>& matrix) {
    N = matrix.size();
    return nQueen(matrix, 0);
    ;
}
                    


                        Solution in Java :

import java.util.*;

class Solution {
    // TOP LEFT TO BOTTOM RIGHT
    private Set<Integer> ord;
    // bottom left to top right
    private Set<Integer> wack;
    private Set<Integer> rows;
    private Set<Integer> columns;
    private int[][] matrix;
    public boolean solve(int[][] matrix) {
        this.matrix = matrix;
        ord = new HashSet();
        wack = new HashSet();
        rows = new HashSet();
        columns = new HashSet();
        int count = 0;
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[0].length; j++) {
                if (matrix[i][j] == 1) {
                    count++;
                    rows.add(i);
                    columns.add(j);
                    wack.add(i + j);
                    ord.add(i - j);
                }
            }
        }
        return recurse(0, 0, count);
    }
    public boolean recurse(int i, int j, int count) {
        if (count == matrix.length) {
            return true;
        }
        if (j == matrix[0].length) {
            i++;
            j = 0;
        }
        if (i == matrix.length)
            return false;

        if (!rows.contains(i) && !columns.contains(j) && !wack.contains(i + j)
            && !ord.contains(i - j)) {
            rows.add(i);
            columns.add(j);
            wack.add(i + j);
            ord.add(i - j);

            if (recurse(i, j + 1, count + 1))
                return true;

            rows.remove(i);
            columns.remove(j);
            wack.remove(i + j);
            ord.remove(i - j);
        }
        return recurse(i, j + 1, count);
    }
}
                    


                        Solution in Python : 
                            
class Solution:
    def solve(self, board):
        n = len(board)
        rows, cols = [False] * n, [False] * n
        diagll, diagrr = [False] * (2 * n - 1), [False] * (2 * n - 1)

        def handleBlocking(row, col, action):
            board[row][col] = rows[row] = cols[col] = action
            diagll[row + col] = diagrr[row - col + n - 1] = action

        def isSafe(row, col):
            ans = (
                board[row][col]
                + rows[row]
                + cols[col]
                + diagll[row + col]
                + diagrr[row - col + n - 1]
            )
            return ans == 0

        for i in range(n):
            for j in range(n):
                if board[i][j] == 1:
                    handleBlocking(i, j, 1)

        def nqueen(row=0):
            if row == n:
                return True
            if 1 in board[row]:
                return nqueen(row + 1)
            for col in range(n):
                if isSafe(row, col):
                    handleBlocking(row, col, 1)
                    if nqueen(row + 1):
                        return True
                    handleBlocking(row, col, 0)
            return False

        ans = nqueen()
        return ans
                    


View More Similar Problems

Pair Sums

Given an array, we define its value to be the value obtained by following these instructions: Write down all pairs of numbers from this array. Compute the product of each pair. Find the sum of all the products. For example, for a given array, for a given array [7,2 ,-1 ,2 ] Note that ( 7 , 2 ) is listed twice, one for each occurrence of 2. Given an array of integers, find the largest v

View Solution →

Lazy White Falcon

White Falcon just solved the data structure problem below using heavy-light decomposition. Can you help her find a new solution that doesn't require implementing any fancy techniques? There are 2 types of query operations that can be performed on a tree: 1 u x: Assign x as the value of node u. 2 u v: Print the sum of the node values in the unique path from node u to node v. Given a tree wi

View Solution →

Ticket to Ride

Simon received the board game Ticket to Ride as a birthday present. After playing it with his friends, he decides to come up with a strategy for the game. There are n cities on the map and n - 1 road plans. Each road plan consists of the following: Two cities which can be directly connected by a road. The length of the proposed road. The entire road plan is designed in such a way that if o

View Solution →

Heavy Light White Falcon

Our lazy white falcon finally decided to learn heavy-light decomposition. Her teacher gave an assignment for her to practice this new technique. Please help her by solving this problem. You are given a tree with N nodes and each node's value is initially 0. The problem asks you to operate the following two types of queries: "1 u x" assign x to the value of the node . "2 u v" print the maxim

View Solution →

Number Game on a Tree

Andy and Lily love playing games with numbers and trees. Today they have a tree consisting of n nodes and n -1 edges. Each edge i has an integer weight, wi. Before the game starts, Andy chooses an unordered pair of distinct nodes, ( u , v ), and uses all the edge weights present on the unique path from node u to node v to construct a list of numbers. For example, in the diagram below, Andy

View Solution →

Heavy Light 2 White Falcon

White Falcon was amazed by what she can do with heavy-light decomposition on trees. As a resut, she wants to improve her expertise on heavy-light decomposition. Her teacher gave her an another assignment which requires path updates. As always, White Falcon needs your help with the assignment. You are given a tree with N nodes and each node's value Vi is initially 0. Let's denote the path fr

View Solution →