八皇后问题

|回溯|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;
}
posted @ 2025-11-22 22:51  channy_zheng  阅读(8)  评论(0)    收藏  举报