N皇后问题,也是路径问题。经典回溯(DFS)算法
function name(n) {
const res = []
let arr = []
for (let j = 0; j < n; j++) {
let temp = []
for (let i = 0; i < n; i++) {
temp.push('.')
}
arr.push(temp)
}
backtrack(arr, 0);
return res;
function backtrack(board, row) {
if (row == board.length) {
const end = board.map(v => [...v])
res.push(end);
return;
}
let n = board[row].length;
for (let col = 0; col < n; col++) {
if (!isValid(board, row, col)) {// 排除不合法的选择
continue;
}
board[row][col] = 'Q';// 做选择
backtrack(board, row + 1); // 进⼊下⼀层决策树
board[row][col] = '.';// 取消选择
}
}
function isValid(board, row, col) {
let n = board.length;
for (let i = row - 1; i >= 0; i--) {
if (board[i][col] == 'Q') { return false; }
}
for (let i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++) {
if (board[i][j] == 'Q') return false;
}
for (let i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) {
if (board[i][j] == 'Q') return false;
}
return true;
}
}
console.log(name(4).length);
留个别人的BFS与DFS的区别链接
https://cuijiahua.com/blog/2018/01/alogrithm_10.html
摘自这老兄说得一句话:BFS 常用于找单一的最短路线,它的特点是 “搜到就是最优解”,而 DFS 用于找所有解的问题,它的空间效率高,而且找到的不一定是最优解,必须记录并完成整个搜索,故一般情况下,深搜需要非常高效的剪枝)。