基于集合的回溯
class Solution {
public:
void backTrack(int n, int row, unordered_set<int>& col, unordered_set<int>& diagnalLeft, unordered_set<int>& diagnalRight, vector<vector<int>>& ret, vector<int>& pos) {
if (row == n) {
ret.push_back(pos);
}
for (int i = 0; i < n; ++i) {
if (col.find(i) != col.end()) {
continue;
}
int diagnalL = row + i;
if (diagnalLeft.find(diagnalL) != diagnalLeft.end()) {
continue;
}
int diagnalR = row - i;
if (diagnalRight.find(diagnalR) != diagnalRight.end()) {
continue;
}
pos[row] = i;
col.insert(i);
diagnalLeft.insert(diagnalL);
diagnalRight.insert(diagnalR);
backTrack(n, row + 1, col, diagnalLeft, diagnalRight, ret, pos);
col.erase(i);
diagnalLeft.erase(diagnalL);
diagnalRight.erase(diagnalR);
}
}
vector<vector<string>> solveNQueens(int n) {
vector<vector<string>> ans;
vector<int> pos(n, 0);
vector<vector<int>> ret;
unordered_set<int> col, diagnalLeft, diagnalRight;
backTrack(n, 0, col, diagnalLeft, diagnalRight, ret, pos);
for (vector<int> i : ret) {
vector<string> subString;
for (int j : i) {
string a;
for (int k = 0; k < n; k++) {
if (k != j) {
a += ".";
}
else {
a += "Q";
}
}
subString.push_back(a);
}
ans.push_back(subString);
}
return ans;
}
};