最初一股脑暴力,发现超时,于是开始优化。
最后的S其实就是所有数的和除以n。
没必要都填完再判断,填一行判断一行;填到最后一行时,填一列判断一列;填到最后一个数时判断对角线是否符合即可。
#includeusing namespace std; #define ll long long int a[20],vis[20],mp[5][5],f,n; ll aver; bool ok(int x,int y){ ll sum=0; if(y==n){ for(int i=1;i<=n;i++)sum+=mp[x][i]; if(sum!=aver)return 0; } sum=0; if(x==n){ for(int i=1;i<=n;i++)sum+=mp[i][y]; if(sum!=aver)return 0; } if(x==n&&y==n){ sum=0; for(int i=1;i<=n;i++)sum+=mp[i][i]; if(sum!=aver)return 0; sum=0; for(int i=1;i<=n;i++)sum+=mp[i][n+1-i]; if(sum!=aver)return 0; } return 1; } void dfs(int x,int y,int cnt){ if(f||!ok(x,y))return; if(x==n&&y==n){ f=1; cout >n; for(int i=1;i<=n*n;i++){ cin>>a[i]; aver+=a[i]; } aver/=n; sort(a+1,a+1+n*n); for(int i=1;i<=n*n;i++){ //cout< 欢迎分享,转载请注明来源:内存溢出
评论列表(0条)