题解 | #N皇后问题#

N皇后问题

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

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param n int整型 the n
     * @return int整型
     */
     int n;
     vector<bool> col, dg, udg;  // 列 正对角线 反对角线
    int Nqueen(int _n) {
        // write code here
        n = _n;
        col = vector<bool> (n);  // 初始化列的数量
        dg = udg = vector<bool> (2 * n);  // 初始化正反对角线的数量
        return dfs(0);
    }

    int dfs(int u ) {
        if (u == n ) return 1;  // 如果找到了就返回方案数量1
        int res = 0;  // 统计方案数量
        for (int i = 0; i < n; i ++ ) {
            if (!col[i] && !dg[u - i + n] && !udg[u + i]) {  // 如果列、正对角线、反对角线的这个位置没有放过就可以放
                col[i] = dg[u - i + n] = udg[u + i] = true;  // 标记列、正对角线、反对角线都放过了
                res += dfs(u + 1);  // 递归到下一层 然后进行方案数量累加
                col[i] = dg[u - i + n] = udg[u + i] = false;  // 恢复现场
            }
        }
        return res;
    }
};
#N皇后问题#
全部评论

相关推荐

06-02 15:17
门头沟学院 Java
心爱的idea:怎么会呢 应该是打招呼有问题 问就说实习6个月全国可飞随时到岗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务