zoukankan      html  css  js  c++  java
  • 算法——二进制解决N皇后(超级酷炫o((>ω< ))o

    先贴代码:

    public class Solution {
    
        void NQueen(int N, int row, int col, int pie, int na, int[] res) {
            if (row == N) {
                res[0]++;
                return;
            }int bits = (~(col | pie | na))&((1<<N)-1);
            while (bits > 0) {
                int p = bits&(-bits);
                NQueen(N, row+1, col|p, (pie|p)<<1, (na|p)>>1, res);
                bits &=(bits-1);
            }
        }
    
        public int totalNQueens(int n) {
            int[] res = new int[1];
            NQueen(n, 0, 0, 0, 0, res);
            return res[0];
        }
    
        public static void main(String[] args) {
            Solution s = new Solution();
            System.out.println(s.totalNQueens(4));
        }
    }

    这里稍微解释一下:

    int bits = (~(col | pie | na))&((1<<N)-1); 
    //这句的用处是获得当前行能放皇后的位置(比特位来表示,1表示能放皇后,2表示不能) col pie na 中的比特位1表示有皇后攻击 0表示没有皇后攻击。
    三个数取或运算得到所有被攻击的位置,取反后与棋盘长度做与运算将
    棋盘长度外的比特位置零;
    int p = bits&(-bits);
    //这句话得到了bits中末尾的1的位置对应的整数,换句话说,其实就是打算从右到左取比特位为1的位置进行递归;
    bits &=(bits-1);
    //上一步已经把最左边的位置进行了递归,所以这次就要把最左边这个比特位的1踢掉,准备下一次while循环

  • 相关阅读:
    Socket编程基础——Socket选项
    Socket编程基础——无连接UDP
    Socket编程基础——面向连接TCP
    初探网络编程
    常用的正则表达式匹配
    iOS中的桥接方式
    iOS中的原生框架生成二维码
    iOS中的单例模式
    iOS
    iOS 中实现 快速归档 与 快速解档
  • 原文地址:https://www.cnblogs.com/gaoquanquan/p/10865157.html
Copyright © 2011-2022 走看看