题解 | #N皇后问题#

N皇后问题

https://www.nowcoder.com/practice/c76408782512486d91eea181107293b6

如何判断皇后是否冲突?

  • 用一个pos数组记录每一行已经存放的皇后的列数,即pos的下标为皇后的行坐标,pos的内容是皇后的列坐标,之后每次递归的根据这个pos数组中已经记录的皇后的位置,来判断当前位置是否能摆放皇后,如果能摆放皇后就继续递归判断后面的行数中能摆放皇后的位置,直到达到最大行则回溯。
  • 设要摆放的皇后的位置为row,col,当前已记录的皇后的位置为i,pos[i],则两者是否在同一对角线上可以用abs(row-i) == abs(col-pos[i])判断,是否为同一行用row==i判断,是否为同一列用col==pos[i]判断。

参考

https://blog.nowcoder.net/n/ab2b9112a3c84b3baca69fa55ce06bac?f=comment

/**
 * 
 * @param n int整型 the n
 * @return int整型
 */
function Nqueen( n ) {
    // write code here
    let count = 0;
    const pos = new Array(n).fill(-1);  // 存放已经摆放好的皇后的位置信息,即每行的第几列放置皇后
    const _isValid = (row, col, pos) => {
        // 遍历已经记录的行
        for (let i = 0; i < row; ++i) {  // 在当前行之前(i<row)是否和当前摆放的皇后的位置冲突
            if (row === i || col === pos[i] || Math.abs(row-i) === Math.abs(col-pos[i])) {
                return false;
            }
        }
        return true;  // 当前位置可以摆放不冲突的皇后
    }
    const _dfs = (row, n, pos) => {
        if (row === n) {  // 遍历到了最后一行
            count++;
            return;
        }

        // 遍历第row行的n个列,即每行逐个列搜索
        for (let i = 0; i < n; ++i) {
            // 检查该位置是否符合条件
            if (_isValid(row, i, pos)) {
                pos[row] = i;  // 符合条件则记录该位置
                _dfs(row+1, n, pos);  // 递归继续查找剩余行的位置
            }
        }
    }

    _dfs(0, n, pos);  // 从第一行开始递归遍历
    return count;
}
module.exports = {
    Nqueen : Nqueen
};

全部评论

相关推荐

头像
11-27 14:28
长沙理工大学
刷算法真的是提升代码能力最快的方法吗?&nbsp;刷算法真的是提升代码能力最快的方法吗?
牛牛不会牛泪:看你想提升什么,代码能力太宽泛了,是想提升算法能力还是工程能力? 工程能力做项目找实习,算法也分数据结构算法题和深度学习之类算法
点赞 评论 收藏
分享
冷艳的小师弟在看机会:jd测评乱点直接被挂了,哭死~
点赞 评论 收藏
分享
牛客410815733号:这是什么电影查看图片
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务