题意:经典N皇后问题,给一个n*n的棋盘,每行、每列、每斜面只能放置一个皇后,问有几种放置的方法;
输入:n = 4
输出:[[".Q…","…Q",“Q…”,"…Q."],["…Q.",“Q…”,"…Q",".Q…"]]
解释:如上图所示,4 皇后问题存在两个不同的解法。
vector<vector<string>> solveNQueens(int n) {
vector<vector<string>> ret;
vector<int> queens(n, -1);
unordered_map<int, int> columns, diagonals1, diagonals2;
function<void(int)> backtrack = [&](int row) {
if (row == n) {
vector<string> res;
for (int i = 0; i < n; i++) {
string tmp = string(n, '.');
tmp[queens[i]] = 'Q';
res.push_back(tmp);
}
ret.push_back(res);
return;
}
for (int i = 0; i < n; i++) {
if (columns[i] || diagonals1[row-i] || diagonals2[row+i])
continue;
queens[row] = i;
columns[i] = diagonals1[row-i] = diagonals2[row+i] = 1;
backtrack(row+1);
queens[row] = -1;
columns[i] = diagonals1[row-i] = diagonals2[row+i] = 0;
}
};
backtrack(0);
return ret;
}