题意:
给矩阵中0位置填数,问能不能使得矩阵的每一行的和、每一列的和、两个对角线的和都相等。
保证矩阵中只有一个0.
思路:
从行和和列和计算出0位置要填的数,再判断对角线
开始读错了题意WA了好几发...
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int n;
ll row[600],col[600];
ll num[600][600];
set<ll>s;
int main()
{
scanf("%d",&n);
int x,y;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%I64d",&num[i][j]);
if(num[i][j]==0)
{
x=i;y=j;
}
row[i]+=num[i][j];
col[j]+=num[i][j];
}
}
if(n==1)
{
printf("1\n");
return 0;
}
for(int i=1;i<=n;i++)
s.insert(row[i]);
if(s.size()!=2)
{
printf("-1\n");
return 0;
}
ll k=abs(*s.begin()-*(++s.begin()));
ll torow=max(*s.begin(),*(++s.begin()));
s.clear();
for(int i=1;i<=n;i++)
s.insert(col[i]);
if(s.size()!=2)
{
printf("-1\n");
return 0;
}
ll d=abs(*s.begin()-*(++s.begin()));
ll tocol=max(*s.begin(),*(++s.begin()));
if(k!=d)
{
printf("-1\n");
return 0;
}
ll sum1=0,sum2=0;
for(int i=1;i<=n;i++)
{
sum1+=num[i][i];
if(num[i][i]==0)
sum1+=k;
sum2+=num[i][n-i+1];
if(num[i][n-i+1]==0)
sum2+=k;
}
if((row[x]+k!=torow)||(col[y]+k!=tocol))
{
printf("-1\n");
return 0;
}
else if(sum1!=sum2||sum1!=torow)
{
printf("-1\n");
return 0;
}
else
{
printf("%I64d\n",k);
}
}