rt,不开O2就是#7#8都TLE。
其余测试点均AC,#8虽然TLE,但下了数据,输出是正确的。
code
#include<iostream>
#include<cmath>
#define int long long
using namespace std;
int n,ans;
int anss[80000][15];//输出前三个
bool a[15][15],b[15];//标记
bool check2(int,int,int,int);//判断两皇后是否能互吃
bool check1(int,int);
void dfs(int);
signed main(){
cin>>n;
dfs(1);//"1"指搜到第一层
for(int i=1;i<=3;++i){
for(int j=1;j<=n;++j){
cout<<anss[i][j];
if(j!=n)cout<<' ';
}
cout<<endl;
}
cout<<ans;
}
void dfs(int k){
if(k>n){
++ans;
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
if(a[i][j]){
anss[ans][i]=j;
}
}
}
return;
}
for(int ny=1;ny<=n;++ny){//此层(第k层)搜新的y
if(check1(ny,k)&&!b[ny]){
a[k][ny]=1;
b[ny]=1;
dfs(k+1);
b[ny]=0;
a[k][ny]=0;
}
}
}
bool check1(int m,int k){//相当于判断a[k][m]的存在符不符合要求
for(int i=1;i<k;++i){
for(int j=1;j<=n;++j){
if(a[i][j]){
if(!check2(i,j,k,m))return 0;
}
}
}
return 1;
}
bool check2(int x1,int y1,int x2,int y2){
if(y1==y2){//双皇后竖吃
return 0;
}
//不用判断x1==x2(横吃)是因为在check1中i必小于k
if(x2-x1==abs(y2-y1)){//斜吃
return 0;
}
return 1;
}
在本地运行(火车头,文件IO)第八个点约三秒
求助大佬