Note:
每行、每列、斜着不能有一样的, 我们按行来进行搜索
每一行的时候去遍历每个位置,看看这个位置对应的列和两条斜线有没有皇后
开三个状态数组,记列挺好记的,但是两个斜线是个问题:
用一下初中的一次函数,蓝色是蓝色的式子,红的是红色的式子
这样要做到的是映射到截距上面,使得在同一个斜线上面的映射到相同的下标,不同斜线上的点映射到不同的下标
而数组的下标又不能是负数,所以蓝色有可能是负截距的地方给他加个n
还有要开多大的数组的问题,这个斜线的个数是2n - 1个,数几个数就找到规律了
写代码的时候,开完vector记得初始化一下在用
代码如下:
class Solution {
public:
int n;
vector<bool> col, dg, udg;
vector<vector<string>> res;
vector<string> path;
vector<vector<string>> solveNQueens(int _n) {
n = _n;
col = vector<bool>(n);
dg = udg = vector<bool>(n * 2);
path = vector<string>(n, string(n, '.'));
dfs(0);
return res;
}
void dfs(int u){
if(u == n){
res.push_back(path);
return;
}
for(int i = 0; i < n; i ++){
if(!col[i] && !dg[u - i + n] && !udg[u + i]){
col[i] = dg[u - i + n] = udg[u + i] = true;
path[u][i] = 'Q';
dfs(u + 1);
path[u][i] = '.';
col[i] = dg[u - i + n] = udg[u + i] = false;
}
}
}
};