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