Follow up for N-Queens problem.
Now, instead outputting board configurations, return the total number of distinct solutions.
class Solution {
public:
int totalNQueens(int n) {
this->count = 0;
this->column = vector<int>(n,0);
this->main_diagonal = vector<int>(2 * n - 1,0);
this->anti_diagonal = vector<int>(2 * n - 1,0);
vector<int> queens = vector<int>(n,0);
placeQueen(queens,0);//放置皇后
return count;
}
private:
int count ;//解的个数
vector<int> column;//存放所占据的列
vector<int> main_diagonal;//存放所占据主对角线
vector<int> anti_diagonal;//存放所占据主对角线
//输出皇后位置
/*
void printQueens(vector<int> queens){
int n = queens.size();
for(int i =0;i < n;i++){
for(int j =0;j < n;j++){
if(queens[i] == j){
cout<<"# ";
}else{
cout<<"* ";
}
}
cout<<endl;
}
cout<<endl;
}
*/
//放置皇后
void placeQueen(vector<int> &queens,int row){
int n = queens.size();
//找到一个解
if(row == n){
count++;
//printQueens(queens);//输出解
return ;
}
for(int i = 0;i < n;i++){
//所在列及对角线未被占据
if(column[i] == 0 && main_diagonal[row + i] == 0 && anti_diagonal[i - row + n - 1] == 0){
//queens[row] = i;//记录第row行皇后所在位置
//将皇后所在列及对角线值1
column[i] = 1;
main_diagonal[row + i] = 1;
anti_diagonal[i - row + n - 1] = 1;
placeQueen(queens,row + 1);
//queens[row] = 0;
column[i] = 0;
main_diagonal[row + i] = 0;
anti_diagonal[i - row + n - 1] = 0;
}
}
}
};
跟之前的解法略有不同,但是递归的思想基本相同。之前用一个二维数组储存棋盘,现在只需要存储所占据的列,主副对角线,每当摆放一个皇后的时候检查对应的列,主对角线是否被占据,若没有则摆放皇后并向下递归。