N皇后问题2

源代码:

#include<cstdio>
int n,Ans(0),i[17];
void DFS(int T,int L,int D1,int D2) //T表示皇后数。
{
    if (T==n+1)
    {
        Ans++;
        return;
    }
    int S=((1<<n)-1)&(~(i[T]|L|D1|D2));
    while (S)
    {
        int t=S&(-S); //传说中的lowbit(),输出的是二进制数中最后1的位置数。
        DFS(T+1,L+t,(D1+t)<<1,(D2+t)>>1); //层次化的对角线与下一行。
        S-=t; //去掉这个1,相当于枚举所有情况。
    }
}
int main() //位运算优化N皇后问题。
{
    scanf("%d",&n);
    for (int a=1;a<=n;a++)
      for (int b=1;b<=n;b++)
      {
        int t;
        scanf("%d",&t);
        i[a]+=t<<(b-1);
      }
    DFS(1,0,0,0);
    printf("%d",Ans);
    return 0;
}

/*
    位运算是玄学中的玄学!
        举个例子,读入:1 0 1 1
        则对应的i[]为:1101 --> 13
        进入DFS(),S=(10000-1 --> 1111)&(~1101|0000|0000|0000 --> ~1101 --> ...0010)
        即S=0010 --> 2
        进入while()后,经过lowbit(),t=10 --> 2 
        DFS(T+1,0010 --> 2,0100 --> 4,0001 --> 1)
        由于S=0,结束循环,并进入下一层。
    然后一层一层地搜索。
*/
原文地址:https://www.cnblogs.com/Ackermann/p/6021773.html