题目大意: 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?n小于等于8。
解题思路: 使用DFS遍历每个位置,判断是否能够插入黑皇后(或插入白皇后),若能,插入,遍历下一层;若不能,回溯至上一层。
//蓝桥杯官网 2n皇后问题
//Writed by Maolin Xiao,2020 03 08
//妇女节快乐!!!
#include<bits/stdc++.h>
using namespace std;
int map1[10][10];
int n;
int ans = 0;
int judge_b(int x,int y){
for(int i = 0;i < n;i++){
if(map1[x][i] == 2) return 0;
if(map1[i][y] == 2) return 0;
if(x - i >= 0 && y - i >= 0 && map1[x - i][y - i] == 2) return 0;
if(x + i < n && y + i < n && map1[x + i][y + i] == 2) return 0;
if(x - i >= 0 && y + i < n && map1[x - i][y + i] == 2) return 0;
if(x - i >= 0 && y + i < n && map1[x - i][y + i] == 2) return 0;
}
return 1;
}
int judge_w(int x,int y){
for(int i = 0;i < n;i++){
if(map1[x][i] == 3) return 0;
if(map1[i][y] == 3) return 0;
if(x - i >= 0 && y - i >= 0 && map1[x - i][y - i] == 3) return 0;
if(x + i < n && y + i < n && map1[x + i][y + i] == 3) return 0;
if(x - i >= 0 && y + i < n && map1[x - i][y + i] == 3) return 0;
if(x - i >= 0 && y + i < n && map1[x - i][y + i] == 3) return 0;
}
return 1;
}
void DFS(int x){
if(x == n) {
ans++;return;
}
for(int i = 0;i < n;i++){
if(map1[x][i] == 1 && judge_b(x,i) == 1){
for(int j = 0;j < n;j++){
if(map1[x][j] == 1 && i != j && judge_w(x,j) == 1){
map1[x][i] = 2;
map1[x][j] = 3;
DFS(x + 1);
map1[x][j] = 1;
map1[x][i] = 1;
}
}
}
}
}
int main(){
cin>>n;
for(int i = 0;i < n;i++){
for(int j = 0;j < n;j++){
cin>>map1[i][j];
}
}
DFS(0);
cout<<ans<<endl;
return 0;
}
如有疑问,欢迎联系2339814485(QQ).