【codeforces 711B】Chris and Magic Square

【题目链接】:http://codeforces.com/contest/711/problem/B

【题意】

让你在矩阵中一个空白的地方填上一个正数;
使得这个矩阵两个对角线上的和;
每一行的和,每一列的和都相同;

【题解】

对于n=1的情况,任意输出一个数字就好;
对于n>1的情况;
先算出不包括空白格子的行的所有元素的和->he;
然后对于其他的可行的行和列,算出它们的和;
一旦与he不一样,直接输出-1无解;
然后包括空白格子的行和列,它们除了那个空白格子的和也要相同->设为sphe;
然后是对角线;
如果包括了空白格子,就先算出和;看看和sphe是不是一样;
如果不包括空白格子,算出的和直接与he比较;
两个对角线同理;
最后
sphe必须要小于he
即严格<不能相同
因为要为正数

【Number Of WA

0

【完整代码】

#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define ps push_back
#define fi first
#define se second
#define rei(x) cin >> x
#define pri(x) cout << x
#define ms(x,y) memset(x,y,sizeof x)

typedef pair<int,int> pii;
typedef pair<LL,LL> pll;

const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const int N = 510;

LL a[N][N],hang[N],lie[N],he=-1;
int n,sx,sy;

int main()
{
    //freopen("F:\rush.txt","r",stdin);
    ios::sync_with_stdio(false);
    rei(n);
    if (n==1)
        return pri(1<<endl),0;
    rep1(i,1,n)
        rep1(j,1,n)
        {
            rei(a[i][j]);
            if (!a[i][j])
                sx = i,sy = j;
        }
    rep1(i,1,n)
    {
        LL temp = 0;
        rep1(j,1,n)
            temp+=a[i][j];
        hang[i] = temp;
        if (sx==i) continue;
        if (he==-1)
            he = temp;
        else
            if (he!=temp)
                return pri(-1<<endl),0;
    }
    rep1(j,1,n)
    {
        LL temp = 0;
        rep1(i,1,n)
            temp+=a[i][j];
        lie[j] = temp;
        if (sy==j) continue;
        if (he!=temp)
            return pri(-1<<endl),0;
    }
    bool in1 = false;
    LL he1 = 0;
    rep1(i,1,n)
    {
        if (i==sx && i==sy) in1 = true;
        he1+=a[i][i];
    }
    if (!in1 && he1!=he) return pri(-1<<endl),0;
    if (in1 && he1!=hang[sx]) return pri(-1<<endl),0;
    bool in2 = false;
    LL he2 = 0;
    rep1(i,1,n)
    {
        if (i==sx && n-i+1==sy) in2 = true;
        he2+=a[i][n-i+1];
    }
    if (!in2 && he2!=he) return pri(-1<<endl),0;
    if (in2 && he2!=hang[sx]) return pri(-1<<endl),0;
    if (hang[sx]<he)
    {
        pri(he-hang[sx]);
    }
    else
        pri(-1<<endl);
    //printf("
%.2lf sec 
", (double)clock() / CLOCKS_PER_SEC);
    return 0;
}
原文地址:https://www.cnblogs.com/AWCXV/p/7626444.html