feat: 0051.N皇后 更简洁清晰的javascript版本

This commit is contained in:
eat to 160 pounds
2023-12-08 21:51:19 +08:00
parent 5c20612aba
commit c0c5e38d9f

View File

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