两种代码,第二种稍微快一点。。
#include<iostream>
#include<cstdio>
using namespace std;
int a[15];
int Count=0;
int n;
void f(int cur){
if(cur==n){
Count++;
if(Count<=3)
{
for(int k=0;k<n;k++)
printf("%d ",a[k]+1);
printf("\n");
}
}
for(int i=0;i<n;i++){
a[cur]=i;
int ok=1;
for(int j=0;j<cur;j++){
if(a[j]==a[cur]||j-a[j]==cur-a[cur]||j+a[j]==cur+a[cur])
{
ok=0;
break;
}
}
if(ok) f(cur+1);
}
}
int main(){
cin>>n;
f(0);
cout<<Count;
return 0;
}
记忆数组
cur+i表示副对角线标号,cur-i+n表示主对角线标号
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n;
int Count=0;
int vis[3][50];
int C[20];
int tot=0;
void search(int cur)
{
if(cur==n){
Count++;
tot++;
if(tot<=3){
for(int i=0;i<n;i++)
printf("%d ",C[i]+1);
printf("\n");
}
}
else for(int i=0;i<n;i++)
{
if(!vis[0][i]&&!vis[1][cur+i]&&!vis[2][cur-i+n])//
{
C[cur]=i;
vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=1;
search(cur+1);
vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=0;
}
}
}
int main()
{
cin>>n;
search(0);
printf("%d",Count);
return 0;
}