40分,求助
查看原帖
40分,求助
547658
Shiota_Nagisa楼主2022/3/31 19:05
#include<bits/stdc++.h>
using namespace std;
int square[10][10],n;//方格
int number[100];//数字
int sum_one;//数字和
bool used[100];//重复
bool judge(){
	int now_sum=0;
	for(int i=1;i<=n;i++){//行
		now_sum=0;
		for(int j=1;j<=n;j++){
			now_sum+=square[i][j];
		}
		if(now_sum!=sum_one){
			return 0;
		}
	}
	now_sum=0;
	for(int i=1;i<=n;i++){//列
		now_sum=0;
		for(int j=1;j<=n;j++){
			now_sum+=square[j][i];
		}
		if(now_sum!=sum_one){
			return 0;
		}
	}
	now_sum=0;
	for(int i=1;i<=n;i++){//对角线
		now_sum+=square[i][i];
	}
	if(now_sum!=sum_one){
		return 0;
	}
	now_sum=0;
	for(int i=1;i<=n;i++){//对角线
		now_sum+=square[i][n-i+1];

	}

	if(now_sum!=sum_one){

		return 0;
	}
	return 1;
}
void dfs(int x,int y){//选数
	if(y==1&&x>1){
		int pre_s=0;
		for(int i=1;i<=n;i++){
			pre_s+=square[x-1][i];
		} 
		if(pre_s!=sum_one){
			return ;
		}
	}
	if(x==n+1){
		if(judge()){//判断结束
			cout<<sum_one<<endl;
			for(int i=1;i<=n;i++){
				for(int j=1;j<=n;j++)
					cout<<square[i][j]<<" ";
				cout<<endl;
			}
			exit(0);
		}
		else return ;
	}
	for(int i=1;i<=n*n;i++){
		if(!used[i]){
			used[i]=1;
			square[x][y]=number[i];
			if(y==n){
				dfs(x+1,1);
			}
			else dfs(x,y+1);
			used[i]=0;
		}
	}
}
int main(){
	cin>>n;
	for(int i=1;i<=n*n;i++){
		cin>>number[i];
		sum_one+=number[i];
	}
	sum_one/=n;
	sort(number+1,number+1+n);
	dfs(1,1);
}
2022/3/31 19:05
加载中...