题目大意:输出N皇后问题(行列对角线不能冲突)的所有解,每个解是一个字符串数组,第i个字符串代表棋盘中的第i行,'Q'代表放置皇后,'.'代表空。
分析:dfs回溯。列出所有解的题目自然想到回溯法求解。用数组记录,i行的皇后放到了cols[i]列,来判断是否可以放置皇后。如何判断对角线是否冲突?想一想是不是:行号之差=列号之差说明在同一对角线上。
代码:转载自https://blog.csdn.net/u010560443/article/details/51079035
class Solution {
public:
vector<vector<string> > result;
void create_Matrix(vector<int> cols) {
string row(cols.size(), '.'); //声明一个全部由'.'组成的字符串
vector<string> temp;
for (int i = 0; i < cols.size(); i++) {
row[cols[i]] = 'Q'; //修改第i行的第cols[i]列
temp.push_back(row);
row[cols[i]] = '.'; //将Q改回.以便下个循环添加新的row字符串
}
result.push_back(temp);
}
bool isOK(vector<int> cols, int pos) {
for (int i = 0; i < pos; i++) { //判断pos行的皇后是否和pos之前行的皇后冲突
if (cols[i] == cols[pos] || abs(cols[i] - cols[pos]) == abs(i - pos)) //列或者对角线冲突返回false
return false;
}
return true;
}
void dfs(vector<int> &cols, int pos, int n) {
if (pos == n) {
create_Matrix(cols);
return;
}
else {
for (cols[pos] = 0; cols[pos] < n; cols[pos]++) { //dfs在第pos行的每列放置皇后
if (isOK(cols, pos))
dfs(cols, pos + 1, n);
}
}
}
vector<vector<string> > solveNQueens(int n) {
vector<int> cols(n);
dfs(cols, 0, n);
return result;
}
};