diff --git a/problems/0051.N皇后.md b/problems/0051.N皇后.md index 6bc4fa78..f6290793 100644 --- a/problems/0051.N皇后.md +++ b/problems/0051.N皇后.md @@ -453,60 +453,66 @@ func isValid(n, row, col int, chessboard [][]string) bool { ### Javascript ```Javascript -var solveNQueens = function(n) { - function isValid(row, col, chessBoard, n) { - - for(let i = 0; i < row; i++) { - if(chessBoard[i][col] === 'Q') { - return false - } - } - - for(let i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) { - if(chessBoard[i][j] === 'Q') { - return false - } - } - - for(let i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++) { - if(chessBoard[i][j] === 'Q') { - return false - } - } - return true - } - - function transformChessBoard(chessBoard) { - let chessBoardBack = [] - chessBoard.forEach(row => { - let rowStr = '' - row.forEach(value => { - rowStr += value - }) - chessBoardBack.push(rowStr) - }) - - return chessBoardBack - } - - let result = [] - function backtracing(row,chessBoard) { - if(row === n) { - result.push(transformChessBoard(chessBoard)) - return - } - for(let col = 0; col < n; col++) { - if(isValid(row, col, chessBoard, n)) { - chessBoard[row][col] = 'Q' - backtracing(row + 1,chessBoard) - chessBoard[row][col] = '.' - } - } - } - let chessBoard = new Array(n).fill([]).map(() => new Array(n).fill('.')) - backtracing(0,chessBoard) - return result - +/** + * @param {number} n + * @return {string[][]} + */ +var solveNQueens = function (n) { + const ans = []; + const path = []; + const matrix = new Array(n).fill(0).map(() => new Array(n).fill(".")); + // 判断是否能相互攻击 + const canAttack = (matrix, row, col) => { + let i; + let j; + // 判断正上方和正下方是否有皇后 + for (i = 0, j = col; i < n; i++) { + if (matrix[i][j] === "Q") { + return true; + } + } + // 判断正左边和正右边是否有皇后 + for (i = row, j = 0; j < n; j++) { + if (matrix[i][j] === "Q") { + return true; + } + } + // 判断左上方是否有皇后 + for (i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) { + if (matrix[i][j] === "Q") { + return true; + } + } + // 判断右上方是否有皇后 + for (i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++) { + if (matrix[i][j] === "Q") { + return true; + } + } + return false; + }; + const backtrack = (matrix, row, col) => { + if (path.length === matrix.length) { + ans.push(path.slice()); + return; + } + for (let i = row; i < matrix.length; i++) { + for (let j = col; j < matrix.length; j++) { + // 当前位置会导致互相攻击 继续下一轮搜索 + if (canAttack(matrix, i, j)) { + continue; + } + matrix[i][j] = "Q"; + path.push(matrix[i].join("")); + // 另起一行搜索 同一行只能有一个皇后 + backtrack(matrix, i + 1, 0); + matrix[i][j] = "."; + path.pop(); + } + } + }; + backtrack(matrix, 0, 0); + return ans; }; ```