#include <iostream>
#include <vector>
#include <string>
using namespace std;
class Solution {
private:
int **mat;
int limit;
vector<vector<string>> res;
void init(int n){
mat = new int*[n];
for (int i = 0; i < n; ++i){
mat[i] = new int[n];
}
for (int i = 0; i < n; ++i){
for (int j = 0; j < n; ++j){
mat[i][j] = 0;
}
}
limit = n;
}
bool check(int row, int col){
for (int i = 0; i < row; ++i){
if (mat[i][col])//不能同列
return false;
for (int j = 0; j < limit; ++j){
if (mat[i][j]){
if (abs(i - row) == abs(j - col))//不能在对角线上
return false;
else
break;
}
}
}
return true;
}
void dfs(int row){
if (row >= limit){
vector<string> temp;
for (int i = 0; i < limit; ++i){
temp.push_back(string(limit, '.'));
for (int j = 0; j < limit; ++j){
if (mat[i][j])
temp[i][j] = 'Q';
}
}
res.push_back(temp);
}
for (int col = 0; col < limit; ++col){
if (check(row, col)){
mat[row][col] = 1;
dfs(row + 1);
mat[row][col] = 0;
}
}
}
public:
vector<vector<string>> solveNQueens(int n) {
init(n);
dfs(0);
return res;
}
};
int main(){
Solution sol;
vector<vector<string>> res = sol.solveNQueens(8);
for (int i = 0; i < res.size(); ++i){
//vector<string> temp = res[i];
for (int j = 0; j < res[i].size(); ++j){
cout << res[i][j] << endl;
}
cout << endl;
}
}
n皇后 dfs解法
最新推荐文章于 2022-08-21 18:14:48 发布