51. N 皇后 - 力扣(LeetCode)
//思路:DFS+哈希。
//本题的难点就在于剪枝操作。
class Solution {
public:
int n;
vector<vector<string>> ans;
vector<string> path;
bool cols[10], dig1[20], dig2[20];
void dfs(int row)
{
if(row==n)//当行越界时,说明已经有符合题意的棋盘,插入结果中
{
ans.push_back(path);
return;
}
for(int col = 0;col<n;col++)
{
if(!cols[col]&&!dig1[row-col+n]&&!dig2[row+col])//判断是否满足要求
{
path[row][col] = 'Q';//满足要求则在该位置放入皇后
cols[col] = dig1[row-col+n] = dig2[row+col] = true;//并将该位置所在列、所在主对角线、所在副对角线全部标记为 true
dfs(row+1);//进入下一行遍历
path[row][col] = '.';//递归回来后将该位置的皇后撤回
cols[col] = dig1[row-col+n] = dig2[row+col] = false;//将 bool 数组复原
}
}
}
vector<vector<string>> solveNQueens(int _n)
{
n = _n;
path.resize(n);
for(int i = 0;i<n;i++)
path[i].append(n,'.');//初始棋盘全为 ' . '
dfs(0);
return ans;
}
};