http://codeforces.com/problemset/problem/711/B
给一个n*n的矩阵,将其中一个0改成其他正数,使得每行每列2个对角线的和都相等,暴力即可,但是要注意如果得到的答案是一个负数,那么也算是不符合的情况。
#include<bits/stdc++.h>
using namespace std; long long int a[555][555];
long long int b[555];
long long int c[555];
int main(){
int n;
long long int zx;
long long int yx;
while(scanf("%d",&n)!=EOF)
{
zx=0;
yx=0;
int i,j;
int u,v;
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
scanf("%I64d",&a[i][j]);
b[i]+=a[i][j];
c[j]+=a[i][j];
if(a[i][j]==0)
{
u=i;v=j;
}
if(i==j)zx+=a[i][j];
if(i==n+1-j)yx+=a[i][j];
}
}
if(n==1)
{
cout<<"1"<<endl;
continue;
}
else {
bool flag=0;
long long int th;
if(u==1){
th=b[2]-b[1];
if(th<0)flag=1;
b[u]+=th;
c[v]+=th;
if(u==v)zx+=th;
if(u+v==n+1)yx+=th;
}
else {
th=b[u-1]-b[u];
if(th<0)flag=1;
b[u]+=th;
c[v]+=th;
if(u==v)zx+=th;
if(u+v==n+1)yx+=th;
}
if(zx!=yx)flag=1;
for(i=2;i<=n;i++)
{
if(b[i]!=b[i-1])flag=1;
if(c[i]!=c[i-1])flag=1;
}
if(zx!=b[1])flag=1;
if(flag==0&&th>0)cout<<th<<endl;
else cout<<"-1"<<endl;
}
}
return 0;
}