求助玄关
查看原帖
求助玄关
1053122
liruizhou_lihui楼主2024/9/20 00:16

好像是剪枝写错了

#include<bits/stdc++.h>
#define int long long
using namespace std;

int n;
int a[50],sum;
int g[10][10];
bool vis[1000];

bool check()
{
	
	//先看行和列 
	for(int i=1;i<=n;i++)
	{
		int s=0;
		for(int j=1;j<=n;j++)
		{
			s+=g[i][j];
		}
		if(s!=sum)
		{
			return 0;
		}
	}
	for(int i=1;i<=n;i++)
	{
		int s=0;
		for(int j=1;j<=n;j++)
		{
			s+=g[j][i];
		}
		if(s!=sum)
		{
			return 0;
		}
	}
	//看对角线 
	int s=0;
	for(int i=1;i<=n;i++)
	{
		s+=g[i][i];
	}
	if(s!=sum)
	{
		return 0;
	}
	s=0;
	for(int i=1;i<=n;i++)
	{
		s+=g[i][n-i+1];
	}
	if(s!=sum)
	{
		return 0;
	}
	return 1; 
}


void dfs(int x,int y)
{
	
	if(x==n+1 && y==1)
	{
		if(!check())
		{	
			return;
		}
		//幻方成立 
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=n;j++)
			{
				cout<<g[i][j]<<' ';
			}
			cout<<'\n';
		}
		exit(0);
	}
	
	int xx=x;
	int yy=y+1;
	if(yy==n+1)//如果这行填满了 
	{
		//---------------------------
		int s=0;
		for(int i=1;i<=n;i++)
		{
			s+=g[x][i];
		}
		if(s!=sum)
		{
			return;
		}
		//--------------------------
		yy=1;
		xx++;
	}
	for(int i=1;i<=n*n;i++)
	{
		if(vis[i]==1)
		{
			continue;
		}
		vis[i]=1;
		g[x][y]=a[i];
		dfs(xx,yy);
		vis[i]=0;
		g[x][y]=0;
	}
}
signed main()
{
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	ios::sync_with_stdio(0); 
	cin.tie(0);
	cin>>n;
	for(int i=1;i<=n*n;i++)
	{
		cin>>a[i];
		sum+=a[i]; 
	}
	sort(a+1,a+n*n+1);
	sum/=n;
	cout<<sum<<'\n';
	dfs(1,1);
	return 0;
}

2024/9/20 00:16
加载中...