强烈推荐的教程:算法与数据结构,回溯法求解八皇后,最经典的递归问题_哔哩哔哩_bilibili
#include<iostream>
#include<vector>
using namespace std;
long long t;
//put_queen函数用来改变attack矩阵
void put_queen(int k,int i,vector<vector<int>> &attack){ //k是第几行,i是第几列
t++;
cout<<t<<' ';
int n=attack.size();
for(int j=0;j<n;j++){
attack[k][j]=1;
attack[j][i]=1;
}
int x=k,y=i;
while(x>0&&y>0){
x--;
y--;
attack[x][y]=1;
}
x=k;
y=i;
while(x>0&&y<n-1){
x--;
y++;
attack[x][y]=1;
}
x=k;
y=i;
while(x<n-1&&y>0){
x++;
y--;
attack[x][y]=1;
}
x=k;
y=i;
while(x<n-1&&y<n-1){
x++;
y++;
attack[x][y]=1;
}
//打印attack矩阵
/* cout<<"attack matrix:"<<endl;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cout<<attack[i][j]<<" ";
}
cout<<endl;
} */
}
void backtrack(int k,int n,vector<string> &queen,vector<vector<int>> &attack,vector<vector<string>> &solve){
if(k==n){
solve.push_back(queen);
return;
}
for(int i=0;i<n;i++){
if(attack[k][i]==0){
vector<vector<int>> temp=attack;
queen[k][i]='Q';
put_queen(k,i,attack);
backtrack(k+1,n,queen,attack,solve);
attack=temp;
queen[k][i]='.';
}
}
}
vector<vector<string>> solveNQueens(int n) {
vector<vector<string>> solve;
vector<vector<int>> attack;
vector<string> queen;
for(int i=0;i<n;i++){
attack.push_back(vector<int>());
for(int j=0;j<n;j++){
attack[i].push_back(0);
}
queen.push_back("");
queen[i].append(n,'.');
}
backtrack(0,n,queen,attack,solve);
return solve;
}
int main(){
int n;
cout<<"input n:";
cin>>n;
vector<vector<string>> result;
result=solveNQueens(n);
for(int i=0;i<result.size();i++){
for(int j=0;j<result[i].size();j++){
cout<<result[i][j]<<endl;
}
cout<<endl;
}
cout<<"total solutions:"<<result.size()<<endl;
return 0;
}