CF 711B - Chris and Magic Square
Posted Luke_Ye
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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; }
以上是关于CF 711B - Chris and Magic Square的主要内容,如果未能解决你的问题,请参考以下文章
CodeForces 711B Chris and Magic Square (暴力,水题)
Codeforces 711B. Chris and Magic Square
codeforces #369div2 B. Chris and Magic Square
CF 1042 E. Vasya and Magic Matrix