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; }