题目链接

https://www.dotcpp.com/oj/problem1460.html

题目大意

正方形棋盘,n个黑皇后,n个白皇后,同色皇后不能同行同列同对角线放置,问总共多少种放置方式。
与之类似的是“m皇后问题(链接中的链接中的链接有“八皇后问题”)
如果不会本题,可以先去看看“八皇后问题”再看看“m皇后问题”,最后看看本题。

解题思路

dfs,注意标记的置一与置零,即标志刷新。
我们的dfs,确定每行的黑皇后和白皇后的位置标志置一,再去dfs下一行,回溯的时候标志置零。
开始我思考是否要先dfs黑皇后的位置,再dfs白皇后的位置。发现可以实现,但是分开记录下放置黑白皇后的种数后,总种数是无法计算,或者通过关系公式计算出的,因此我舍弃了这种方式,决定在一个dfs中实现。

AC代码

#include<bits/stdc++.h>
using namespace std;
const int N=100;
int n;
bool vis[N][N];
bool l_b[N],fu_b[N],zhu_b[N];
bool l_w[N],fu_w[N],zhu_w[N];
bool mp[N][N];
int cnt;
void dfs(int h){
    if(h==n){cnt++;return ;}
    for(int i=0;i<n;i++){//black
        if(zhu_b[h-i+n] || fu_b[h+i] || !mp[h][i] || l_b[i]) continue;
        zhu_b[h-i+n]=1,fu_b[h+i]=1,l_b[i]=1;
        vis[h][i]=1;
        for(int j=0;j<n;j++){//white
            if(zhu_w[h-j+n] || fu_w[h+j] || !mp[h][j] || l_w[j] || vis[h][j]) continue;
            zhu_w[h-j+n]=1,fu_w[h+j]=1,l_w[j]=1;
            dfs(h+1);
            zhu_w[h-j+n]=0,fu_w[h+j]=0,l_w[j]=0;
        }
        zhu_b[h-i+n]=0,fu_b[h+i]=0,l_b[i]=0;
        vis[h][i]=0;
    }
}
int main(){
    cin>>n;
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            cin>>mp[i][j];
    dfs(0);
    cout<<cnt;    
}

吐槽

难道蓝桥不给数据范围吗???!!!