题目链接:https://www.acwing.com/problem/content/description/845/
题目如下:
#include <iostream>
#include <vector>
using namespace std;
const int N=100010;
int n;
vector<vector<string>> result;
void backtracking(int n,int startRow,vector<string>& board);
bool isValid(int row,int col,vector<string>& board,int n);
int main(){
cin>>n;
vector<string> board(n,string(n,'.'));
backtracking(n,0,board);
//output,同力扣51题,二维vector输出要多注意
for(int i=0;i<result.size();i++){
for(int j=0;j<n;j++){
cout<<result[i][j]<<endl;
}
cout<<endl;
}
return 0;
}
void backtracking(int n,int startRow,vector<string>& board){
if(startRow==n){
result.push_back(board);
return ;
}
for(int i=0;i<n;i++){//要对每一行(即每一层)的每个元素进行遍历
if(isValid(startRow,i,board,n)){
board[startRow][i]='Q';
backtracking(n,startRow+1,board);
board[startRow][i]='.';
}
}
}
bool isValid(int row,int col,vector<string>& board,int n){
//同行
for(int i=0;i<col;i++){
if(board[row][i]=='Q') return false;
}
//同列
for(int i=0;i<row;i++){
if(board[i][col]=='Q') return false;
}
//同正斜
for(int i=row-1,j=col-1;i>=0&&j>=0;i--,j--){
if(board[i][j]=='Q') return false;
}
//同负斜
for(int i=row-1,j=col+1;i>=0&&j<n;i--,j++){
if(board[i][j]=='Q') return false;
}
return true;
}