您的位置:首页 > 其它

C - Chris and Magic Square CodeForces - 711B

2018-03-27 22:54 513 查看
题目链接https://cn.vjudge.net/contest/218567#problem/C题意很好理解,找出一个值代替0,使得这个矩阵里的数,每行的和,每列的和,俩主对角线上的数的和都相等 ///就是有一个范围注意一下  1<=x<=1e18,实际上>=1就行了,数值不会超过1e18,比赛时就是这个范围这个样例输出-1
3
3 8 1
2 4 6
7 0 5
#include<cstdio>#include<cmath>#include<cstring>#include<iostream>#include<algorithm>using namespace std;typedef long long ll;ll a[555][555];int main(){int n;while(~scanf("%d",&n)){int nx,ny;memset(a,0,sizeof(a));for(int i=0;i<n;i++){for(int j=0;j<n;j++){cin>>a[i][j];if(a[i][j]==0){nx=i;ny=j;}}}if(n==1) printf("1\n");else{ll lie0=0;//0在的那行的所有值的和for(int j=0;j<n;j++)lie0+=a[nx][j];ll lie=0;//一非0行所有值的和for(int i=0;i<n;i++){if(i!=nx){for(int j=0;j<n;j++){lie+=a[i][j];}break;}}ll ans1=lie-lie0;//找到一个待定答案a[nx][ny]=ans1;int ff=0;for(int i=0;i<n;i++){ll tempx=0;for(int j=0;j<n;j++){tempx+=a[i][j];}if(tempx!=lie)ff=1;//判断每行是否满足}for(int j=0;j<n;j++){ll tempy=0;for(int i=0;i<n;i++)tempy+=a[i][j];if(tempy!=lie) ff=1;//判断每列}ll xie1=0,xie2=0;//两条主对角线for(int i=0;i<n;i++){xie1+=a[i][i];xie2+=a[i][n-i-1];}if(xie1!=lie||xie2!=lie) ff=1;if(ff==0&&ans1>=1&&ans1<=1e18) cout<<ans1<<endl;else cout<<"-1"<<endl;}}}
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: