对最大为MAX*MAX的棋盘,任意数量种的皇后,种类数量以queen记录,每种皇后的同一行,同一列,以及对角线上不能有其他同种类的皇后,一个格子只能放一个皇后棋子,计算最多摆放方案的数量,并记录在ans[][]内,输出方案数量。
判断对角线用
abs(行-行) == abs(列-列)
后续再更新优化,用二进制保存数据判断运算。
#include <iostream>
#include <cmath>
#include <cstring>
#define MAX 13//棋盘最大范围
#define queen 2//两种棋
using namespace std;
int N;
int rst = 0;
bool map[MAX][MAX];
int ans[queen][MAX];
void test(){//测试数据
N = 13;
for(int i = 0; i < N; ++i){
for(int j = 0; j < N; ++j){
map[i][j] = 1;
}
}
}
void inputData(){
cin >> N;
for(int i = 0; i < N; ++i){
for(int j = 0; j < N; ++j){
cin >> map[i][j];
}
}
}
bool check(int row, int column, int chess){
if(map[row][column] == 1){
for(int i = 0; i < chess; ++i){
if(ans[i][row] == column){
return 0;
}
}
for(int i = 0; i < row; ++i){
if(ans[chess][i] == column){//判断同列
return 0;
}
if(abs(i - row) == abs(ans[chess][i] - column)){//判断对角线
return 0;
}
}
return 1;//能放
}else{
return 0;//不能放
}
}
void dfs(int row, int chess){
if(row == N){
if(chess == queen-1){
rst++;
cout << rst << endl;
}else{
dfs(0, chess + 1);
}
}
for(int column = 0; column < N; ++column){
if(!check(row, column, chess)){
continue;
}else{
ans[chess][row] = column;//记录每种棋在每几行的列数
dfs(row+1, chess);
}
}
}
int main(){
test();
dfs(0, 0);//第0种棋的第0行开始
cout << rst;
return 0;
}
ps:一种棋时,各大小棋盘的解数量
n solution(n)
1 1
2 0
3 0
4 2
5 10
6 4
7 40
8 92
9 352
10 724
11 2680
12 14200
13 73712
14 365596
15 2279184
16 14772512
17 95815104
18 666090624
19 4968057848
20 39029188884
21 314666222712
22 2691008701644
23 24233937684440
24 227514171973736
25 2207893435808352
来源:CSDN
作者:Yuyao_Xu
链接:https://blog.csdn.net/Yuyao_Xu/article/details/104318760