#include <iostream>
#include <cmath>
#include <cstdlib>
using namespace std;
// 棋盘 N * N
int N;
// 数组x, x[3] = 2 意思是棋盘第3行第2列下了棋子
int* x;
// 一共有多少种解法
int sum = 0;
// 约束条件
bool constraint(int k) {
// k为行数,同时作为列的索引
// 从第一行开始遍历到这一行,
// 判断对角线:第k行与第i行 行的差值是否等于 第k行的第x[k]列与第i行的第x[i]列 列的差值
// 判断上下:判断第i行,第x[i]列的值是否等于第k行第x[k]的值
for (int i = 1; i < k; i++)
if ((abs(k - i) == abs(x[k] - x[i])) || (x[i] == x[k]))
return false;
return true;
}
void Backtrack(int t) {
// 8*8棋盘,能遍历到第9个说明前八个没问题了,解法+1
if (t > N) {
sum++;
}
else
// 遍历行数
for (int i = 1; i <= N; i++) {
// 在第t行第i列放棋子
x[t] = i;
// 判断是否合法,合法就这一行ok,递归下一行
if (constraint(t))
Backtrack(t + 1);
}
}
/*
关于回溯:不合法的可能性会从38行处回溯,接着进入遍历
*/
int main() {
cin >> N;
// 初始化数组
x = new int[N + 1];
for (int i = 0; i <= N; i++)
x[i] = 0;
Backtrack(1);
cout << sum << endl;
delete[] x;
return 0;
}
算法分析-n皇后,回溯,递归解法
于 2022-06-09 14:28:45 首次发布