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;
    }
};
全部评论

相关推荐

01-14 12:08
门头沟学院 Java
神哥了不得:(非引流)1.既然发出来了简历,就稍微提一点点小建议,确实简历很不错了,练手项目可以换一些质量高的,工作内容,可以加上一些量化指标,比如第一条系统响应速度由多少变成多少,减少了百分之多少,第4条就很不错。2.广投,年前实习招募比较少了
点赞 评论 收藏
分享
评论
6
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务