题目链接:http://codeforces.com/problemset/problem/711/B
题目大意:
输入 n ,输入 n*n 的矩阵,有一个占位 0 , 求得将 0 位置换成其他的整数 使得矩阵 行列斜 和全部相等。
代码状态:
一把辛酸泪
2016.09.24 8:14 再次更新 DOWN 【昨天晚上的‘杯具’要谨记,做题要看懂题,看清题的要求再做,切记、切记、切记】
补解题思路:
1.
1.1 先特殊判断 n 是否==1,如果等于 1 则直接输出 1 即可
1.2 如果 n > 1 判断 0 的位置在哪个位置,找一个要填入到0位置的数。
如果 0 在第一行,那么用第二行的和 减去 第一行的和,便是要填入的值.
如果 0 在最后一行,那么用倒数第二行的和 减去 最后一行的和,便是要填入的值.
其他的 则 0 在中间位置 ,那么可以用 前一行或者后一行的和 减去 0 所在的和,便是要填入的值.
(用列减也可以)
【看清题意,如果填入的值 <1 则输出 -1】
2.
将要填入的值填到 0 的位置 进行全部的扫描判断即可。全盘的扫描不在解释。
AC Code:
#include<bits/stdc++.h>
using namespace std;
const int N=+;
typedef long long ll;
ll na[N][N];
int check(int n)
{
ll ans=,ans1=;
int i,j;
for(i=; i<=n; i++)
ans+=na[][i],ans1+=na[i][];
if(ans!=ans1)
return ;
ans1=;
ll ans2=;
for(i=; i<=n; i++)
{
for(j=; j<=n; j++)
ans1+=na[i][j], ans2+=na[j][i];
if(ans!=ans2||ans1!=ans2||ans!=ans1)
return ;
ans1=ans2=; }
ans1=ans2=;
for(i=; i<=n; i++)
{
for(j=; j<=n; j++)
if(i==j)
ans1+=na[i][j],ans2+=na[i][n-i+];
}
if(ans!=ans2||ans1!=ans2||ans!=ans1)
return ;
return ;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
int i,j;
if(n==)
{
scanf("%d",&n);
printf("1\n");
continue;
}
int x,y;
for(i=; i<=n; i++)
for(j=; j<=n; j++)
{
scanf("%d",&na[i][j]);
if(na[i][j]==)x=i,y=j;
}
ll ans=,ans1=;
if(x==)
{
for(i=; i<=n; i++)
ans+=na[][i],ans1+=na[][i];
na[x][y]=ans1-ans;
}
else if(x==n)
{
for(i=; i<=n; i++)
ans+=na[n][i],ans1+=na[n-][i];
na[x][y]=ans1-ans;
}
else
{
for(i=; i<=n; i++)
ans+=na[x][i],ans1+=na[x-][i];
na[x][y]=abs(ans1-ans);
} if(check(n))
printf("%I64d\n",na[x][y]<?-:na[x][y]);
else printf("-1\n");
}
return ;
}