我的解法:
// 八皇后问题 递归回溯 同时记得返回现场
// 皇后必然放在不同的行 check时考虑列即可 而且在check时只需要check 刚刚下过的上面的部分
bool check(vector<vector<int>> &visit, int row, int col){// 对第i个位置沿竖直水平斜线方向检测
int len = visit.size();
for(int i=0;i<len;i++){
if(visit[i][col]==1) return false;
}
// 主对角线 check下过的位置 即左上方
for(int i=row-1, j=col-1;i>=0&&j>=0;i--,j--){
if(visit[i][j]==1) return false;
}
// 副对角线 check下过的位置 即右上方
for(int i=row-1, j=col+1;i>=0&&j<len;i--,j++){
if(visit[i][j]==1) return false;
}
return true;
}
void solution(vector<vector<int>> &visit, int row, int &ans){
int len = visit.size();
if(row == len) ans++;
else{
for(int j=0;j<len;j++){
if(check(visit, row, j)){// 合法 就下在当前位置
visit[row][j] = 1;
solution(visit, row+1, ans);
visit[row][j] = 0;
}
}
}
}
int main() {
Solution s;
int tmp=0, n=8;
vector<vector<int>> a(n, vector<int>(n, 0));
solution(a, 0, tmp);
cout<<tmp;
}