题目
July 9, 2021 · View on GitHub
n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n ,返回 n 皇后问题 不同的解决方案的数量。
示例 1:

输入:n = 4
输出:2
解释:如上图所示,4 皇后问题存在两个不同的解法。
示例 2:
输入:n = 1
输出:1
提示:
- 1 <= n <= 9
- 皇后彼此不能相互攻击,也就是说:任何两个皇后都不能处于同一条横行、纵行或斜线上。
参考答案
class Solution {
public:
int totalNQueens(int n) {
unordered_set<int> columns, diagonals1, diagonals2;
return backtrack(n, 0, columns, diagonals1, diagonals2);
}
int backtrack(int n, int row, unordered_set<int>& columns, unordered_set<int>& diagonals1, unordered_set<int>& diagonals2) {
if (row == n) {
return 1;
} else {
int count = 0;
for (int i = 0; i < n; i++) {
if (columns.find(i) != columns.end()) {
continue;
}
int diagonal1 = row - i;
if (diagonals1.find(diagonal1) != diagonals1.end()) {
continue;
}
int diagonal2 = row + i;
if (diagonals2.find(diagonal2) != diagonals2.end()) {
continue;
}
columns.insert(i);
diagonals1.insert(diagonal1);
diagonals2.insert(diagonal2);
count += backtrack(n, row + 1, columns, diagonals1, diagonals2);
columns.erase(i);
diagonals1.erase(diagonal1);
diagonals2.erase(diagonal2);
}
return count;
}
}
};