回溯算法解决全排列问题

引用:https://zhuanlan.zhihu.com/p/93530380
解决一个回溯问题,实际上就是一个决策树的遍历过程。你只需要思考 3 个问题:

1、路径:也就是已经做出的选择。

2、选择列表:也就是你当前可以做的选择。

3、结束条件:也就是到达决策树底层,无法再做选择的条件。

核心思路:我们只要在递归之前做出选择,在递归之后撤销刚才的选择
解决n皇后问题

    function getsolve(solves, solve, rowindex, n) {
        if (rowindex >= n) {
            solves.push(solve)
            return
        }
        for (let i = 0; i < n; i++) {
            //排除不合法的放置
            if (rowExitQueen(rowindex, solve) || lineExitQueen(i, solve, n) || SlashExitQueen(rowindex, i, solve, n)) {
                continue
            }
            //放置
            solve[rowindex] = i;
            //进入下一层
            getsolve(solves, clone(solve), rowindex + 1, n)
            //取消放置
            solve[rowindex] = undefined
        }
    }
    let resultArr = []
    let solves = [];
    getsolve(solves, {}, 0, n)
    solves.forEach(solve => {
        resultArr.push(getSolveResult(solve, n))
    })
    return resultArr
原文地址:https://www.cnblogs.com/cyh1282656849/p/13612718.html