Leetcode 51.N 皇后
题目:https://leetcode.cn/problems/n-queens/
代码
var solveNQueens = function (n) {
// 判断位置是否合法
function isValid (row, col, chessBoard, n) {
// 检查列
for (let i = 0; i < row; i ++){
if (chessBoard[i][col] === 'Q') {
return false
}
}
// 检查45度角
for (let i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--){
if (chessBoard[i][j] === 'Q') {
return false
}
}
// 检查135度角
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 res = []
const backtracking = (row, chessBoard) => {
// 如果到了最后一行,说明可以收集结果
if (row === n) {
res.push(transformChessBoard(chessBoard))
return
}
for (let col = 0; col < n; col++){
if (isValid(row, col, chessBoard, n)) {
// 放置皇后
chessBoard[row][col] = 'Q'
backtracking(row + 1, chessBoard)
// 回溯,撤销皇后
chessBoard[row][col] = '.'
}
}
}
// 申请一个nxn的数组,用.填充
let chessBoard = new Array(n).fill([]).map(() => new Array(n).fill('.'))
backtracking(0, chessBoard)
return res
};
感想