#include<bits/stdc++.h>
using namespace std;
int n;
int cnt=0;
vector<int> temp;
int c[100]={};//行
int d[100]={};//正对角线
int b[100]={};//负对角线
void dfs(int index){
if(index==n+1){
cnt++;
if(cnt<=3){
for(int i=1;i<=n;i++){
if(i==1) cout<<temp[i];
else cout<<' '<<temp[i];
}
cout<<endl;
}
return;
}
for(int i=1;i<=n;i++){
//int flag=1;
//temp[index]=i;
/*for(int j=1;j<index;j++){
if(temp[index]==temp[j]||abs(temp[index]-temp[j])==abs(index-j)){
flag=0;break;
}
}
if(flag==1) dfs(index+1);*/
if(c[i]==0&&d[index+i]==0&&b[index-i+n]==0){
temp[index]=i;
c[i]=1;d[index+i]=1;b[index-i+n]=1;
dfs(index+1);
c[i]=0;d[index+i]=0;b[index-i+n]=0;
}
}
}
int main()
{
cin>>n;
temp.resize(n+1);
dfs(1);
cout<<cnt;
return 0;
}
取方阵行列数尝试(可算得在倾斜方向上,i+j 和 i-j+n 值是固定的)
第二种解法最后一个测试点超时,因为每次都要对前面的和现在的位置进行一次比较,函数内两个耗时O(N^2);
#include<bits/stdc++.h>
using namespace std;
int n;
int cnt=0;
vector<int> temp;
void dfs(int index){
if(index==n+1){
cnt++;
if(cnt<=3){
for(int i=1;i<=n;i++){
if(i==1) cout<<temp[i];
else cout<<' '<<temp[i];
}
cout<<endl;
}
return;
}
for(int i=1;i<=n;i++){
int flag=1;
temp[index]=i;
for(int j=1;j<index;j++){
if(temp[index]==temp[j]||abs(temp[index]-temp[j])==abs(index-j)){
flag=0;break;
}
}
if(flag==1) dfs(index+1);
}
}
int main()
{
cin>>n;
temp.resize(n+1);
dfs(1);
cout<<cnt;
return 0;
}