题目描述
思路分析
dfs入门题-八皇后
dfs一般模板。判断终点->遍历枚举搜索当前状态->符合条件则标记当前状态 且 搜索下一个状态->回溯(还原标记)
dfs(u,n)表示正在搜素第n行,把n作为参数带进去方便写代码。
一些全局变量标记数组,col标记当前列,zhu标记主对角线,fu标记副对角线。path记录搜索路径方案,ans存储答案。
主对角线和副对角线的标记是个trick。
两道题分别要记录方案和记录方案数。很经典的两个问题。一般处理思路是:用path数组随搜索实时记录方案,搜索某个方案的终点时更新ans数组存储答案;搜索到某个方案的终点时更新变量res即可。
两道题的代码只有略微不同。代码实现把两道题合起来写了。
代码实现
class Solution {
public:
vector<vector<string>> ans;
vector<string> path;
unordered_map<int,int> col,zhu,fu;
int res;
int totalNQueens(int n) {
dfs(0,n);
return res;
}
void dfs(int u,int n){
if(u==n){
ans.push_back(path);
res++;
return;
}
for(int i=0;i<n;i++){
if(!col[i]&&!zhu[u-i+n]&&!fu[u+i]){
col[i]=zhu[u-i+n]=fu[u+i]=true;
string cur;
for(int k=0;k<n;k++){
if(k!=i) cur+=".";
else cur+="Q";
}
path.push_back(cur);
dfs(u+1,n);
col[i]=zhu[u-i+n]=fu[u+i]=false;
path.pop_back();
}
}
}
};