Codeforces 711B 【模拟】

比赛的时候绝壁打麻烦了。。。
考虑的好麻烦。。。wa7。。。还要判断出来的是不是positive的。。。
好吧。。认了。。

#include<cstdio>
#include <map>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;

typedef __int64 LL;

const int N=5e2+10;

LL ma[N][N];
LL row[N];
LL col[N];
LL s1,s2;
int n;

int main()
{
    memset(row,0,sizeof(row));
    memset(col,0,sizeof(col));
    s1=s2=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            scanf("%I64d",&ma[i][j]);
//1的话随便
    if(n==1)
    {
        if(!ma[1][1])
            puts("1");
        else
            printf("%I64d
",ma[1][1]);
        return 0;
    }

//找到0位置
    int x=-1,y=-1;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        if(!ma[i][j])
        {
            x=i;
            y=j;
            break;
        }
        if(x!=-1)
            break;
    }
    //printf("%d %d
",x,y);

    for(int i=1;i<=n;i++)
    {
        if(i!=x)
        {
            for(int j=1;j<=n;j++)
                row[i]+=ma[i][j];
        }
    }
    for(int j=1;j<=n;j++)
    {
        if(j!=y)
        {
            for(int i=1;i<=n;i++)
                col[j]+=ma[i][j];
        }
    }
//斜的
//顺的
    if(x!=y)
    {
        for(int i=1;i<=n;i++)
        {
            s1+=ma[i][i];
        }
    }
//逆的
    if(x+y!=n+1)
        for(int i=1;i<=n;i++)
        {
            s2+=ma[i][n-i+1];
        }

    if(x!=y&&x+y!=n+1)
        if(s1!=s2)
        {
            puts("-1");
            return 0;
        }
//横的
    LL temp1,temp2;
    for(int i=1;i<=n;i++)
    {
        if(i!=x)
        {
            temp1=row[i];
            break;
        }
    }
    for(int i=1;i<=n;i++)
    {
        if(i!=x)
        {
            if(temp1!=row[i]||(s1!=row[i]&&x!=y)||(s2!=row[i]&&x+y!=n+1))
            {
                //printf("here?
");
                puts("-1");
                return 0;
            }
        }
    }
//竖的
    for(int i=1;i<=n;i++)
    {
        if(i!=y)
        {
            temp1=col[i];
            break;
        }
    }
    for(int i=1;i<=n;i++)
    {
        if(i!=y)
        {
            if(temp1!=col[i]||(x!=y&&s1!=col[i])||(s2!=col[i]&&x+y!=n+1))
            {
                puts("-1");
                return 0;
            }
        }
    }
    temp2=temp1;
//求一个
    //printf("temp1=%I64d
",temp1);
    for(int i=1;i<=n;i++)
    {
        if(i==x)
        {
            for(int j=1;j<=n;j++)
            {
                if(ma[i][j])
                    temp1-=ma[i][j];
            }
            ma[x][y]=temp1;
            break;
        }
    }
    LL k1,k2,k3,k4;
    temp1=temp2;
    k1=0;
    k2=0;
    k3=0;
    k4=0;
    for(int i=1;i<=n;i++)
        k1+=ma[x][i];
    for(int i=1;i<=n;i++)
        k2+=ma[i][y];
    if(k1!=temp1||k2!=temp2||k1!=k2)
    {
        //printf("here?
");
        puts("-1");
        return 0;
    }
    if(x==y)
    {
        for(int i=1;i<=n;i++)
            k3+=ma[i][i];
        if(k3!=k2)
        {
            puts("-1");
            return 0;
        }
    }
    if(x+y==n+1)
    {
        for(int i=1;i<=n;i++)
            k4+=ma[i][n+1-i];
        if(k4!=k2)
        {
            puts("-1");
            return 0;
        }
    }
    if(ma[x][y]>0)
        printf("%I64d
",ma[x][y]);
    else
        puts("-1");
    return 0;
}

/*
4
1 1 1 1
1 1 0 1
1 1 1 1
1 1 1 1
*/
原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934847.html