一、問題詳情:
????????按照國際象棋的規則,皇后可以攻擊與之處在同一行或同一列或同一斜線上的棋子。
n?皇后問題?研究的是如何將?n
?個皇后放置在?n×n
?的棋盤上,并且使皇后彼此之間不能相互攻擊。
給你一個整數?n
?,返回所有不同的?n?皇后問題?的解決方案。
????????每一種解法包含一個不同的?n 皇后問題?的棋子放置方案,該方案中?'Q'
?和?'.'
?分別代表了皇后和空位。
示例 1:
輸入:n = 4 輸出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]] 解釋:如上圖所示,4 皇后問題存在兩個不同的解法。
示例 2:
輸入:n = 1 輸出:[["Q"]]
提示:
1 <= n <= 9
二、我的答案:
/*** @param {number} n* @return {number}*/
var totalNQueens = function(n) {let count = 0;const cols = new Set(); // 列上是否有皇后const diagonals1 = new Set(); // 左上到右下對角線上是否有皇后const diagonals2 = new Set(); // 右上到左下對角線上是否有皇后function backtrack(row) {if (row === n) {// 找到一個解決方案count++;return;}for (let col = 0; col < n; col++) {const diagonal1 = row - col;const diagonal2 = row + col;if (!cols.has(col) && !diagonals1.has(diagonal1) && !diagonals2.has(diagonal2)) {cols.add(col);diagonals1.add(diagonal1);diagonals2.add(diagonal2);backtrack(row + 1); // 繼續下一行的回溯cols.delete(col);diagonals1.delete(diagonal1);diagonals2.delete(diagonal2);}}}backtrack(0); // 從第一行開始回溯return count;
};