我的超级剪枝搜索为什么会TLE
查看原帖
我的超级剪枝搜索为什么会TLE
431289
lalaouye楼主2022/10/8 14:43
#include<bits/stdc++.h>
using namespace std;
int n,a[17],vis[17],num;
int ans[5][5];
inline void dfs(int x,int y,int z){
	if(y>n||x>n){
		if(x>n){
			int sum=0,sum1=0,sum2=0,sum3=0;
			for(int i=1;i<=n;i++)sum+=ans[1][i];
			for(int i=1;i<=n;i++){
				for(int j=1;j<=n;j++){
					sum1+=ans[i][j];
					sum2+=ans[j][i];
					if(i==j)sum3+=ans[i][j];
				}
				if(sum1!=sum||sum2!=sum)return;
				sum1=sum2=0;
			}
			if(sum!=sum3)return;
			if(sum3!=ans[1][n]+ans[2][n-1]+ans[3][n-2]+ans[4][n])return;
			cout<<sum<<endl;
			for(int i=1;i<=n;i++){
				for(int j=1;j<=n;j++){
					cout<<ans[i][j]<<" ";
				}cout<<endl;
			}exit(0);
		}
		if(y>n)
			if(z==num/n)dfs(x+1,1,0);
	}
	for(int i=1;i<=n*n;i++){
		if(vis[i])continue;
		if(y==n){
			int u=a[i];
			for(int j=1;j<n;j++) u+=ans[x][j];
			if(u!=num/n) continue;
		}
		if(x==n){
			int u=a[i];
			for(int j=1;j<n;j++) u+=ans[j][y];
			if(u!=num/n) continue;
		}
		if(x==n&&y==1){ 
			int u=a[i];
			for(int j=1;j<n;j++) u+=ans[j][n-j+1];
			if(u!=num/n) continue;
		}
		if(x==n&&y==n){
			int u=a[i];
			for(int j=1;j<n;j++) u+=ans[j][j];
			if(u!=num/n) continue;
		}vis[i]=1;ans[x][y]=a[i];
		dfs(x,y+1,z+a[i]);
		vis[i]=0;
	}
}
int main(){
	cin>>n;
	for(int i=1;i<=n*n;i++)scanf("%d",&a[i]),num+=a[i];sort(a+1,a+n*n+1);
	dfs(1,1,0);
}
2022/10/8 14:43
加载中...