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

相关推荐

Wy_m:只要不是能叫的上名的公司 去实习没有任何意义 不如好好沉淀自己
点赞 评论 收藏
分享
04-30 21:35
已编辑
长安大学 C++
晓沐咕咕咕:评论区没被女朋友好好对待过的计小将可真多。觉得可惜可以理解,毕竟一线大厂sp。但是骂楼主糊涂的大可不必,说什么会被社会毒打更是丢人。女朋友体制内生活有保障,读研女朋友还供着,都准备订婚了人家两情相悦,二线本地以后两口子日子美滋滋,哪轮到你一个一线城市房子都买不起的996清高计小将在这说人家傻😅
点赞 评论 收藏
分享
评论
6
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务