八皇后问题
|回溯|dfs|递归|
本题经典且难度不大,但是关于vector比较的细节:cmp函数的书写以及嵌套式的vector仍然较为新颖。
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
int q[8];
//用来记录每行所放的位置
int cnt = 0;
//用来记录各种排法的编号
vector<vector<int>>res;
//用来分别记录各种结果
bool is_valid(int x,int y){
for(int i=0;i<x;i++){
if(q[i]==y||abs(x-i)==abs(y-q[i])){
return false;
}
}
return true;
}
void dfs(int t){
//t表示已经摆放了t个,即将摆放t+1个,即t+1行
if(t==8){
vector<int>temp;
for(int i=0;i<8;i++){
temp.push_back(q[i]+1);
}
res.push_back(temp);
return;
}
for(int i=0;i<8;i++){
if(is_valid(t,i)){
q[t] = i;
dfs(t+1);
}
}
}
bool cmp(const vector<int>& a, const vector<int>& b){
for(int i = 0; i < 8; i++){
if(a[i] != b[i]){
return a[i] < b[i];
}
}
return false;
}
int main(){
int n;
cin>>n;
int num;
dfs(0);
sort(res.begin(),res.end(),cmp);
while(n--){
cin>>num;
for(int i=0;i<8;i++){
cout<<res[num-1][i];
}
cout<<endl;
}
return 0;
}

浙公网安备 33010602011771号