https://leetcode-cn.com/problems/n-queens/
class Solution {
public:
vector<vector<string>> solveNQueens(int n) {
//按坐标位置存放所有解决方案
vector<vector<pair<int, int>>> solutions;
//存放一种解决方案中的所有皇后的位置
vector<pair<int, int>> solution;
DFS(solutions, solution, 0, n);
//把坐标位置转成string
return transResult(solutions, n);
}
void DFS(vector<vector<pair<int, int>>>& solutions, vector<pair<int, int>>& solution, int curRow, int n)
{
if (curRow == n) solutions.push_back(solution);
//尝试当前行的每一个位置是否可以放置一个皇后
for (int col = 0; col < n; ++col) {
if (isValid(solution, curRow, col)) {
//如果可以,在保存当前位置,继续确定下一行皇后的位置
//直接调用构造函数,内部构造pair, 或者调用make_pair
solution.emplace_back(curRow, col);
DFS(solutions, solution, curRow + 1, n);
//回溯,删除当前位置,尝试当前行的其它位置
solution.pop_back();
}
}
}
// solution: 一个解决方案,从第一行开始到当前行的上一行每一行已经放置皇后的点
bool isValid(vector<pair<int, int>>& solution, int row, int col) {
// 判断当前行尝试的皇后位置是否和前面几行的皇后位置有冲突
// i.second == col: 第i个皇后与当前这个点在同一列
// i.first + i.second == row + col: 第i个皇后与当前点在撇上,横坐标+纵坐标值相同
// i.first - i.second == row - col:第i个皇后与当前点在捺上, 横坐标-纵坐标值相同
for (pair<int, int>& i : solution)
if (i.second == col || i.first + i.second == row + col
|| i.first - i.second == row - col)
return false;
return true;
}
vector<vector<string>> transResult(vector<vector<pair<int, int>>>& solutions, int n) {
vector<string> tmp();
//把每一种解决方案都转换为string形式,最终结果
vector<vector<string>> ret;
for (vector<pair<int, int>>& solution : solutions) {
//n*n char: 每行有n个元素,把皇后的位置修改为Q
vector<string> solutionString(n, string(n, '.'));
for (pair<int, int>& i : solution) {
solutionString[i.first][i.second] = 'Q';
}
ret.push_back(solutionString);
}
return ret;
}
};