题目链接
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;
}吐槽
难道蓝桥不给数据范围吗???!!!

京公网安备 11010502036488号