利用dfs+回溯:因为没行只能放一个所以可以不用对行(dep)进行标记,j遍历列副对角线:dep+j;主对角线:dep+n-j。

#include<iostream>
#include<vector>
using namespace std;
const int N=12;
vector<bool> vis(N),vis2(N),vis3(N);
void dfs(int dep,int n,int& setp)
{
    if(dep==n)
    {
        setp++;
        return;
    }
    for(int j = 0;j<n;j++)
    {
        if(vis[j]||vis2[dep+j]||vis3[dep+n-j]) continue;
        vis[j]=true;
        vis2[dep+j]=true;
        vis3[dep+n-j]=true;
        dfs(dep+1,n,setp);
        vis[j]=false;
        vis2[dep+j]=false;
        vis3[dep+n-j]=false;
    }
}
int main()
{
    int n;
    cin>>n;
    int setp = 0;
    dfs(0,n,setp);
    cout<<setp<<endl;
    return 0;
}