源代码:
#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,结束循环,并进入下一层。
然后一层一层地搜索。
*/