Skip to content

51. N-Queens

Description

The n-queens puzzle is the problem of placing n queens on an n x n chessboard such that no two queens attack each other.

Given an integer n, return all distinct solutions to the n-queens puzzle. You may return the answer in any order.

Each solution contains a distinct board configuration of the n-queens' placement, where 'Q' and '.' both indicate a queen and an empty space, respectively.

 

Example 1:

Input: n = 4
Output: [[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]
Explanation: There exist two distinct solutions to the 4-queens puzzle as shown above

Example 2:

Input: n = 1
Output: [["Q"]]

 

Constraints:

  • 1 <= n <= 9

 

Solutions

Solution: Backtracking

  • Time complexity: O(n2)
  • Space complexity: O(n2)

 

JavaScript

js
/**
 * @param {number} n
 * @return {string[][]}
 */
const solveNQueens = function (n) {
  const chessBoard = new Array(n)
    .fill('')
    .map(() => new Array(n).fill('.'));
  const result = [];
  const isValid = current => {
    for (let row = current.row - 1; row >= 0; row--) {
      if (chessBoard[row][current.col] === 'Q') return false;
    }
    const maxOffset = Math.max(current.row, current.col);

    for (let offset = 1; offset <= maxOffset; offset++) {
      const { row, col } = current;

      if (chessBoard[row - offset]?.[col - offset] === 'Q') return false;
      if (chessBoard[row - offset]?.[col + offset] === 'Q') return false;
    }
    return true;
  };
  const placementQueen = row => {
    if (row === n) {
      result.push(chessBoard.map(row => row.join('')));
      return;
    }
    for (let col = 0; col < n; col++) {
      if (!isValid({ row, col })) continue;
      chessBoard[row][col] = 'Q';
      placementQueen(row + 1);
      chessBoard[row][col] = '.';
    }
  };

  placementQueen(0);
  return result;
};

Released under the MIT license