N皇后

N皇后问题

http://www.nowcoder.com/questionTerminal/c76408782512486d91eea181107293b6

思路

  1. 列,对角线,斜对角线是否可放棋子分别用二进制数表示
  2. 每次枚举可放棋子的列,使用lowbit运算

参考链接

https://zhuanlan.zhihu.com/p/22846106

class Solution {
private:
    int cnt = 0;
    int col;
    int dg;
    int udg;
    map<int, int> mp;
public:
    /**
     *
     * @param n int整型 the n
     * @return int整型
     */
    int lowbit(int x){
        return x & -x;
    }

    void dfs(int x, int &n){
        int avail = col & (dg >> x) & (udg >> (n-x));
        for(int y=avail;y;y -= lowbit(y)){
            if(x == n-1) cnt++;
            else{
                int t = mp[lowbit(y)];
                col -= 1 << t;
                dg -= 1 << (x + t);
                udg -= 1 << (t - x + n);
                dfs(x+1, n);
                col += 1 << t;
                dg += 1 << (x + t);
                udg += 1 << (t - x + n);
            }
        }
    }

    int Nqueen(int n) {
        for(int i=0;i<n;i++) mp[1 << i] = i;
        col = (1 << n) - 1;
        dg = udg = (1 << (2*n)) - 1;
        dfs(0, n);
        return cnt;
    }
};
全部评论

相关推荐

27届毕业,最近想找一段大厂实习,感觉简历有些问题,好多都不给面,求大佬们指点,最近好焦虑
后端劝退第91人:我从后端的角度分析一下你的第一个项目,我感觉亮点不是很突出。因为我是因为组内有需求,临时上手学react干活。我用到的技术基本就cover你那个智慧园区管理平台的很多亮点了。那作为比较专业的前端,你上述的内容是不是有点单薄呢。感觉还得包装
点赞 评论 收藏
分享
迷茫的大四🐶:你这个拿去投央国企吧,投私企包过不了的
点赞 评论 收藏
分享
10-09 16:12
门头沟学院 Java
帅宇殿下:佬,简历写的什么
点赞 评论 收藏
分享
评论
6
收藏
分享

创作者周榜

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