思路:
2n八皇后问题,
对于每个合法的黑色皇后排列后,计算当前条件下白皇后可以放置的种类数
#include<bits/stdc++.h> using namespace std; const int maxn = 10 + 7; int n, ans = 0; int mp[maxn][maxn]; int y1_[maxn], y2_[maxn]; bool is_ok1(int cnt, int u) { for(int i = 1; i <= cnt; ++i) { if(y1_[i] == u || abs(cnt+1-i) == abs(u-y1_[i]) ) return false; } return true; } bool is_ok2(int cnt, int u) { for(int i = 1; i <= cnt; ++i) { if(y2_[i] == u || abs(cnt+1-i) == abs(u-y2_[i]) ) return false; } return true; } int dfs2(int cnt) { if(cnt == n) return 1; int res = 0; for(int i = 1; i <= n; ++i) { if(mp[cnt+1][i] && is_ok2(cnt,i)) { //mp[cnt+1][i] = 0; y2_[cnt+1] = i; res += dfs2(cnt+1); //mp[cnt+1][i] = 1; } } return res; } int dfs1(int cnt) { if(cnt == n) { //or(int i = 1; i <= n; ++i) cout << y1_[i] << " "; //cout << " === " << endl; int res = 0; for(int i = 1; i <= n; ++i) { if(mp[1][i]) { mp[1][i] = 0; y2_[1] = i; res += dfs2(1); mp[1][i] = 1; } } return res; } int res = 0; for(int i = 1; i <= n; ++i) { if(mp[cnt+1][i] && is_ok1(cnt, i)) { mp[cnt+1][i] = 0; y1_[cnt+1] = i; res += dfs1(cnt+1); mp[cnt+1][i] = 1; } } return res; } int main() { cin >> n; for(int i = 1; i <= n; ++i) { for(int j = 1; j <= n; ++j) { cin >> mp[i][j]; } } for(int i = 1; i <= n; ++i) { if(mp[1][i]) { mp[1][i] = 0; y1_[1] = i; ans += dfs1(1); mp[1][i] = 1; } } cout << ans; return 0; }