第二次做,还是不能流畅做出来。
针对每一列进行防止判断,使用递归进行下一层(行)放置
class Solution {
public:
/**
*
* @param n int整型 the n
* @return int整型
*/
// 每一行只放置一个,所以可以建立行与列之间的映射关系
int Nqueen(int n) {
int res = 0;
std::vector<int> pos(n, -1);
recursion(n, pos, res, 0);
return res;
}
private:
// row的有效范围为 0 ~ n-1
void recursion(const int &n, std::vector<int> &pos, int &res, int row) {
if (row == n) {
++res;
return ;
}
// 针对每一列判断
// 递归增加行数
for (int i = 0; i < n; ++i) {
if (able_push(pos, row, i)) {
pos[row] = i;
recursion(n, pos, res, row + 1);
}
}
}
bool able_push(const std::vector<int> &pos, int row, int col) {
// 对已经放置过的每一行遍历,查找是否能放置
for (int i = 0; i < row; ++i) {
if (pos[i] == col || std::abs(i - row) == std::abs(pos[i] - col)) {
return false;
}
}
return true;
}
};