目录
前言
踏平坎坷成大道,斗罢艰险又出发!
自律的尽头是自控,自控的尽头是硬控。
愿道友们披荆斩棘,终能得偿所愿。
简介
本人是小几年经验的前端开发,算法基础只有力扣几十道题,非常薄弱。
今天是个人的代码随想录算法硬控自己第19天,继续回溯。
题目链接:51. N皇后
var solveNQueens = function (n) {
// res存储结果
// chestBoard初始化: n=3, 此时为[['.', '.', '.'], ['.', '.', '.'], ['.', '.', '.']]
let res = [], chestBoard = Array.from({ length: n }, () => Array(n).fill('.'));
const isValid = (chessboard, row, col, n) => {
// 检查列,i<row而不是i<n是因为row后面的行肯定还没被填充呢,这是个剪枝
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;
};
const backtracking = function (chestBoard, row, n) {
// 终止条件,只要成功到了最后一行也就是n-1行,那就是合法结果
if (row === n) {
res.push(chestBoard.map((item) => item.join('')));
return;
}
for (let i = 0; i < n; i++) {
if (isValid(chestBoard, row, i, n)) {
chestBoard[row][i] = 'Q';
backtracking(chestBoard, row + 1, n);
chestBoard[row][i] = '.';
}
}
}
backtracking(chestBoard, 0, n);
return res;
};