CF 711B - Chris and Magic Square

挺简单的一道题,但是做的时候没想好就开始写代码了,导致迷之WA,还是要多练习啊。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <set>
#define LL long long int
using namespace std;
LL Map[505][505];
int main() {
    cin.sync_with_stdio(false);
    int n;
    while(cin>>n)
    {
        int x,y;
        LL sumy[505],sumx[505],sum[2]={0,0};
        for(int i=0;i<n;i++)
        {
            sumy[i]=sumx[i]=0;
            for(int j=0;j<n;j++)
            {
                cin>>Map[i][j];
                if(Map[i][j]==0)
                    y=i,x=j;
            }
        }
        //特判1
        if(n==1)
        {
            cout<<1<<endl;
            continue;
        }
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
            {
                sumx[j]+=Map[i][j],sumy[i]+=Map[i][j];
                if(i==j)
                    sum[0]+=Map[i][j];
                if(i==(n-j-1))
                    sum[1]+=Map[i][j];
            }
        set<LL> s;
        set<LL>::iterator it;
        LL flag=1,more=2,less=1;
        s.insert(sum[0]),s.insert(sum[1]);
        for(int i=0;i<n;i++)
            s.insert(sumx[i]),s.insert(sumy[i]);
        if(s.size()>2)//超过两种就GG
            flag=0;
        if(s.size()==2)//保证和0点关联的都是较小的反之较大
        {
            it=s.begin();
            more=*it;
            it++;
            less=*it;
            if(more<less)
                swap(more,less);
            for(int i=0;i<n;i++)
            {
                if(i==x)
                {
                    if(sumx[i]!=less)
                        flag=0;
                }
                else
                    if(sumx[i]!=more)
                        flag=0;
                if(i==y)
                {
                    if(sumy[i]!=less)
                        flag=0;
                }
                else
                    if(sumy[i]!=more)
                        flag=0;
            }
            if(x==y)
            {
                if(sum[0]!=less)
                    flag=0;
            }
            else
                if(sum[0]!=more)
                    flag=0;
            if(x==n-y-1)
            {
                if(sum[1]!=less)
                    flag=0;
            }
            else
                if(sum[1]!=more)
                    flag=0;
        }
        else if(s.size()==1)//0点必须在中心
        {
            if(n%2!=1||x!=n/2||y!=n/2)
                flag=0;
        }
        if(flag)
            cout<<more-less<<endl;
        else
            cout<<-1<<endl;
    }
    return 0;
}

 

posted @ 2016-09-03 20:07  Luke_Ye  阅读(163)  评论(0编辑  收藏  举报