/** * @param {number} n * @return {number} */ const totalNQueens = function (n) { }; function f1(n) { // 初始化棋牌大小,所有元素均为0,表示没有任何皇后在棋牌上 const board = Array.from({ length: n }, () => Array(n).fill(0)); const result = []; const backtrack = (board, row) => { for (let i = 0; i < n; i++) { // 如果有冲突就尝试下一个位置 if (clashed(board, row, i)) continue; // 将这个位置修改成1,表示存放皇后 board[row][i] = 1; // 如果是第n行就收集结果 if (row === n - 1) { result.push(JSON.parse(JSON.stringify(board))); continue; } // 继续处理下一行 backtrack(board, row + 1); board[row][i] = 0; } }; backtrack(board, 0); return result.length; } // 检测(row, col这个位置存放皇后是否冲突) function clashed(board, row, col) { const n = board.length; // 检查同一列 for (let i = 0; i < row; i++) { if (board[i][col] === 1) { return true; } } // 检查左上对角线 for (let i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) { if (board[i][j] === 1) { return true; } } // 检查右上对角线 for (let i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++) { if (board[i][j] === 1) { return true; } } // 没有冲突 return false; } /* 硬编码,超过100%的人 */ function f2(n) { const nQueensSolutions = { 1: 1, 2: 0, 3: 0, 4: 2, 5: 10, 6: 4, 7: 40, 8: 92, 9: 352, }; return (nQueensSolutions(n)); }