711B Chris and Magic Square (暴力/模擬)
阿新 • • 發佈:2018-12-11
題目大意:輸入 n ,輸入 n*n 的矩陣,有一個佔位 0 , 求得將 0 位置換成其他的整數 使得矩陣 行列斜 和全部相等。
題解:一開始居然無腦地想用最暴力的辦法,列舉空位可以填的數字,然後每次判斷填上這個數字可不可行
這樣的話時間複雜度是,接近1e10了,肯定會T
我們可以先統計出空位在的那一行的和_sum,再隨便找一行求和sum1,這樣sum1-_sum就應該是我們要填入的數字,然後判斷填入這個數字可不可以,可以就輸出,不可以就是-1
但這個題有些坑,其實說是坑,實際是自己思維不夠周全
①n=1的情況
那個這一個數肯定是0,那麼我們最小就是填1
②要填的數字的情況
是不行的,要判斷一下
#include <bits/stdc++.h> using namespace std; typedef long long ll; ll a[600][600]; int n; bool pd() { ll value=-1; for(int i=1; i<=n; ++i) { ll he=0; for(int j=1;j<=n; ++j) he+=a[i][j]; if(value==-1) value=he; else if(value!=he) return 0; } for(int i=1; i<=n; ++i) { ll he=0; for(int j=1; j<=n; ++j) he+=a[j][i]; if(value!=he) return 0; } ll he=0; for(int i=1; i<=n; ++i) { he+=a[i][i]; } if(value!=he) return 0; he=0; for(int i=1; i<=n; ++i) he+=a[i][n-i+1]; if(value!=he) return 0; return 1; } int main() { //freopen("input.txt","r",stdin); cin>>n; int dx=-1,dy=-1; for(int i=1; i<=n; ++i) for(int j=1; j<=n; ++j) { cin>>a[i][j]; if(a[i][j]==0) dx=i,dy=j; } if(n==1) { return cout<<1<<endl,0; } ll _sum=0,sum1=0; for(int i=1; i<=n; ++i) _sum+=a[dx][i]; if(dx==1) for(int i=1; i<=n; ++i) sum1+=a[2][i]; else for(int i=1; i<=n; ++i) sum1+=a[1][i]; ll x=sum1-_sum; a[dx][dy]=x; if(pd() && x>0) cout<<x<<endl; else puts("-1"); return 0; }