class Solution {
public:
int *X; // 一个一维数组,用来纪录每一层选择的位置;
int Sum=0; // 纪录n皇后的解的个数
int N; // 表示n*n的棋盘
int totalNQueens(int n) {
N=n;
Sum=0;
X=new int[n+1];
for(int i=0;i<=n;i++) X[i]=0;
Choose(1);
return Sum;
}
// 选择第k层皇后的位置
void Choose(int k){
if(k>N){
// 说明完成一次方案
Sum++;
return;
}
for(int i=1;i<=N;i++){
X[k]=i; // 为k层选择一个方案
if(IsPlace(k)) Choose(k+1); // 本次符合条件,进入下一层的选择
}
}
// 判断k层所选择的位置,是否可行
bool IsPlace(int k){
for(int i=1;i<k;i++){
// 这里i<k,只需要比较判断k层与k层以下的每一层;
// 1. abs(X[k]-X[i])==abs(k-i) 判断两个点在同一斜线
// 2. (X[i]==X[k] 判断两个点在同一竖排
if(abs(X[k]-X[i])==abs(k-i) || (X[i]==X[k])) return false;
}
return true;
}
};