开了O2最后一个点TLE
查看原帖
开了O2最后一个点TLE
876232
44_FeiDing楼主2023/1/14 00:23

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)第八个点约三秒

求助大佬

2023/1/14 00:23
加载中...