面试题 08.12. 八皇后
注意: 主/副对角线
var solveNQueens = function(n) {
let res = [];
let prev = [];
dfs(n, 0, prev, res)
// console.log(res)
// return res;
let queens = [];
for (let i=0; i < res.length; i++) {
let queen = generate(n, res[i])
queens.push(queen)
}
return queens
};
function dfs(n, row, prev, res) {
if (row == n) {
res.push(prev.slice());
return;
}
for (let col = 0; col < n; col++) {
if (verified(n, prev, col)) {
prev.push(col);
dfs(n, row+1, prev, res);
// 回溯
prev.pop();
}
}
}
function verified(n, path, col) {
// 行: 放置在prev.length
// 列
// 主对角线
// 副对角线
for (let row=0; row<path.length; row++) {
let diff = Math.abs(path[row] - col); // 当前行所在列与目标列的距离
if (diff == 0 || diff == path.length - row) return false;
// 不在一列 不在主副线上: 与目标列的距离不等于到目标行的巨鳖
}
return true;
}
function generate(n, path) {
let queen = Array.from({length: n}, (v, i) => {
let col = new Array(n).fill('.')
let index = path[i];
col[index] = 'Q'
return col.join('');
})
return queen
}
面试题 08.13. 堆箱子
参考: