首页 > 代码库 > CF 711B - Chris and Magic Square

CF 711B - Chris and Magic Square

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

#include <iostream>#include <cstdio>#include <algorithm>#include <queue>#include <set>#define LL long long intusing 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;}

 

CF 711B - Chris and Magic Square