N皇后问题是一个经典问题,在一个N*N的棋盘上放置N个皇后,每行刚好放置一个并使其不能互相攻击(同一行,同一列,同一斜线上的皇后都会自动攻击)
计算一共有多少种合法的方法放置N个皇后
上图为其中的一个解
行列可以很好地判断是不是符合题干,主要是对角线上不能重复,由左下至右上的对角线行列下标相加相同,由左上至右下的对角线(行 - 列)相等
#include<iostream>
using namespace std;
bool col[10], x1[20], x2[20];
int ans = 0;
bool check(int r, int i) {
return !col[i] && !x1[r + i] && !x2[r - i + 8];
}
void dfs(int r) {
if (r == 8) {
ans++;
return;
}
for (int i = 0; i < 8; i++) {
if (check(r, i)) {
col[i] = x1[r + i] = x2[r - i + 8] = true;
dfs(r + 1);
col[i] = x1[r + i] = x2[r - i + 8] = false;
}
}
}
int main() {
dfs(0);
cout << ans << endl;
return 0;
}
#include<iostream>
#include<cstring>
using namespace std;
int n;
int d[10010];
char result[10010][10010];
int num = 0;
bool isLeagal(int row, int col) { //是否符合条件
bool judge = true;
for (int i = 1; i < row; i++) {
if (col == d[i]) {
judge = false;
break;
}
if (i - d[i] == row - col) {
judge = false;
break;
}
if (i + d[i] == row + col) {
judge = false;
break;
}
}
return judge;
}
void dfs(int row) {
if (row == n + 1) {
num++;
return ;
// for(int i = 1; i <= n; i++) {
// cout << result[i] << endl;
// }
// cout << endl;
// cout << num << endl;
}
//核心代码
for (int col = 1; col <= n; col++) { //在row这一行每一列怎么放
if (isLeagal(row, col)) {
d[row] = col;
result[row][col- 1] = 'Q';
dfs(row + 1);
result[row][col-1] = '.';
d[row] = 0;
}
}
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
for (int j = 0; j < n; j++) {
result[i][j] = '.';
}
}
dfs(1);
cout << num << endl;
return 0;
}
————————————————
本文转载自CSDN博主:筱筱xx
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 原文链接:https://blog.csdn.net/m0_62890348/article/details/128808308 |