Description:
Follow up for N-Queens problem.
Now, instead outputting board configurations, return the total number of distinct solutions.
Thought:
从第一行开始尝试性摆放皇后
如果到第 i 列时,与之前的皇后都不冲突,那么则从下一行进行尝试
如果冲突则尝试第 i+1 列,依次递推,直到第 n 行摆放完毕,方案数+1
注意,由于使用递归的方法,所以result需要设置成全局变量,使得它能正常+1
还有一点,使用一维数组,默认每一个元素的数值代表该下标行皇后摆放的位置,减少了开销
Code:
class Solution {
private:
vector<int> result;
public:
int totalNQueens(int n) {
result.push_back(0);
int* maps = new int[n];
setQueens(n, 0, maps);
return result[0];
}
void setQueens(int rows, int n, int maps[]) {
if (rows == n) {
result[0] += 1;
return;
}
for (int i = 0; i < rows; i++) {
maps[n] = i;
if (check(maps,n)) {
setQueens(rows, n + 1, maps);
}
}
}
bool check(int maps[],int rows) {
for (int i = 0; i < rows; i++) {
if (maps[i] == maps[rows] || abs(maps[i] - maps[rows]) == abs(i - rows)) return false;
//对于当前摆放的之前每一行都进行比较,不要i与i+1比较,会漏掉一些情况
}
return true;
}
};