51. N 皇后
看来,只要能归结为树状结构的问题,都不是问题,
结束条件摆上
for循环遍历,需要剪枝,放到if判断中即可,在for循环中就可以自动的跳过这些情况
class dfs51 {
public:
vector<vector<string>> result;
int N;
dfs51(int n) {
N = n;
}
void dfs(int row,vector<string>& path,vector<bool>& isused,unordered_map<int, int>& coordinate) {
if (row == N - 1) {
result.push_back(path);
return;
}
//符合要求,看看下面一行的
for (int i = 0; i < N; i++) {
//看看能不能往这里放
//我想往 row+1 ,i 这一位置放
if (isused[i] == false && isXie(row + 1, i, coordinate)) { //这一列没人用, //排除一下斜对角的
isused[i] = true; //没人用我用了
path[row + 1][i] = 'Q';
coordinate[row + 1] = i;
dfs(row + 1, path, isused, coordinate); //再去找下一行了啊
path[row + 1][i] = '.'; //用完了还你,不要影响到我下一次的遍历
isused[i] = false;
}
}
}
bool isXie(int x,int y, unordered_map<int, int>& coordinate) {
for (int i = 0; i < x; i++) {
if (abs(y - coordinate[i] )==abs( x - i))
return false;
}
return true;
}
};
class Solution {
public:
vector<vector<string>> solveNQueens(int n) {
vector<bool> isused(n, false);
dfs51 d(n);
vector<string> path(n,string(n,'.'));
unordered_map<int, int> coordinate;
d.dfs(-1, path,isused, coordinate);
return d.result;
}
};