解题报告:先放黑皇后再放白皇后。
#include<iostream>
using namespace std;
const int N=22;
int col[N],col2[N];
int a[N][N];
int n;
int ans;
bool check(int t,int u)
{
for(int i=0;i<u;i++)
if(col[i]==t||abs(t-col[i])==abs(i-u)) return false;
return true;
}
bool check2(int t, int u)
{
for(int i=0;i<u;i++)
if(col2[i]==t||abs(t-col2[i])==abs(i-u)) return false;
return true;
}
void dfs2(int u)
{
if(u==n)
{
ans++;
return ;
}
for(int i=0;i<n;i++)
{
if(check2(i,u)&&a[u][i]==1)
{
col2[u]=i;
dfs2(u+1);
}
}
}
void dfs(int u)
{
if(u==n)
{
dfs2(0);
return ;
}
for(int i=0;i<n;i++)
{
if(check(i,u)&&a[u][i]==1)
{
col[u]=i;
a[u][i]=2;
dfs(u+1);
a[u][i]=1;
}
}
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cin>>a[i][j];
dfs(0);
cout<<ans<<endl;
}