思路
起始就是枚举两边n皇后的问题,没什么其他的新的点
代码
#include <cstring>
#include <iostream>
#include <vector>;
#include <algorithm>
#include <math.h>
using namespace std;
int a[10][10];
#define PII pair<int,int>
#define x first
#define y second
int res;
int n;
void dfs(int line,vector<PII> v,bool flag){//v存了已经枚举了的点的坐标,flag表示是枚举的黑皇后还是白皇后
if(line>n){
if(!flag){//如果是黑皇后全部放好了,就在枚举一下白皇后
vector<PII> v;
dfs(1,v,true);
return;
}else{
res++;
return;
}
}
for(int i=1;i<=n;i++){//枚举列
if(!a[line][i])continue;//能不能放
int k=0;
for(;k<v.size();k++){
if(abs(v[k].y-i)==abs(v[k].x-line)){//对角线上
break;
}
if(v[k].y==i)break;//在同一列上
}
if(k<v.size())continue;
a[line][i]=0;
v.push_back({line,i});
dfs(line+1,v,flag);
v.pop_back();//回复现场
a[line][i]=1;
}
}
int main(){
cin >> n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin >> a[i][j];
vector<PII> v;
dfs(1,v,false);
cout << res;
}