代码:
先算黑皇后,再算白皇后
#include<iostream>
using namespace std;
int n,num[10][10],ans=0;
bool vis[2][10],col1[2][20],col2[2][20];
bool check(int a,int b,int k)
{
if(vis[k][b]||num[a][b]==0||col1[k][a-b+n]||col2[k][a+b])
return false;
return true;
}
void dfs(int temp,int k)
{
if(temp==n+1)
{
if(k==0)
{
dfs(1,1);
}
else
ans++;
return;
}
for(int i=1;i<=n;i++)
{
if(check(temp,i,k))
{
vis[k][i]=col1[k][temp-i+n]=col2[k][temp+i]=true;
num[temp][i]=0;
dfs(temp+1,k);
num[temp][i]=1;
vis[k][i]=col1[k][temp-i+n]=col2[k][temp+i]=false;
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>num[i][j];
}
}
dfs(1,0);
cout<<ans<<endl;
return 0;
}