#include<iostream>
#include<cstdio>
using namespace std;
const int N = 20;
int n, ans;
bool mp[N][N], b[N][N];
bool bdui[N], budui[N], bcol[N];
bool wdui[N], wudui[N], wcol[N];
void white(int u){//后放
if(u == n){
ans ++;
return;
}
for(int i = 0; i < n; i ++ )
if(!wcol[i] && !wdui[u + i] && !wudui[i - u + n] && mp[u][i] && !b[u][i]){
wcol[i] = wdui[u + i] = wudui[i - u + n] = true;
white(u + 1);
wcol[i] = wdui[u + i] = wudui[i - u + n] = false;
}
}
void black(int u){//先放
if(u == n){
white(0);
return;
}
for(int i = 0; i < n; i ++ )
if(!bcol[i] && !bdui[u + i] && !budui[i - u + n] && mp[u][i]){
b[u][i] = true;
bcol[i] = bdui[u + i] = budui[i - u + n] = true;
black(u + 1);
bcol[i] = bdui[u + i] = budui[i - u + n] = false;
b[u][i] = false;
}
}
int main(){
cin >> n;
for(int i = 0; i < n; i ++ )
for(int j = 0; j < n; j ++ )
scanf("%d", &mp[i][j]);
black(0);
cout << ans << endl;
return 0;
}
中国矿业大学——算法实验3.4——2n皇后问题
最新推荐文章于 2024-05-30 10:49:56 发布