题目连接
这道题是n皇后问题的延伸
只需要先搜索黑皇后,再在搜索黑皇后的前提下遍历白皇后即可
#include <bits/stdc++.h>
using namespace std;
const int N = 15;
int pic[N][N];
int res;
int n;
//0表示不能放,1表示能放,2表示黑皇后,3表示白皇后
bool col2[N], dg2[N], udg2[N]; //黑
bool col3[N], dg3[N], udg3[N]; //白
void dfs(int u) //按行搜索
{
if (u == n)
{
res++;
return;
}
for (int i = 0; i < n; i++)
{
if (!col2[i] && !dg2[u + i] && !udg2[n - u + i] && pic[u][i] == 1) //黑
{
col2[i] = dg2[u + i] = udg2[n - u + i] = 1; //判断这个位置能不能放黑皇后
pic[u][i] = 2;
for (int j = 0; j < n; j++)
{
if (!col3[j] && !dg3[u + j] && !udg3[n - u + j] && pic[u][j] == 1) //判断这个点能不能放白皇后
{
col3[j]=dg3[u + j]=udg3[n - u + j]=1;
pic[u][j]=3;
dfs(u+1);
col3[j]=dg3[u + j]=udg3[n - u + j]=0; //回溯
pic[u][j]=1;
}
}
col2[i] = dg2[u + i] = udg2[n - u + i] = 0; //回溯
pic[u][i] = 1;
}
}
}
int main()
{
cin >> n;
res = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
cin >> pic[i][j];
dfs(0);
cout << res << endl;
return 0;
}