利用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;
}