【題目鏈接】:http://codeforces.com/contest/711/problem/B
【題意】
讓你在矩陣中一個空白的地方填上一個正數;
使得這個矩陣兩個對角線上的和;
每一行的和,每一列的和都相同;
【題解】
對于n=1的情況,任意輸出一個數字就好;
對于n>1的情況;
先算出不包括空白格子的行的所有元素的和->he;
然后對于其他的可行的行和列,算出它們的和;
一旦與he不一樣,直接輸出-1無解;
然后包括空白格子的行和列,它們除了那個空白格子的和也要相同->設為sphe;
然后是對角線;
如果包括了空白格子,就先算出和;看看和sphe是不是一樣;
如果不包括空白格子,算出的和直接與he比較;
兩個對角線同理;
最后
sphe必須要小于he
即嚴格<不能相同
因為要為正數
【Number Of WA】
0
【完整代碼】
#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define ps push_back
#define fi first
#define se second
#define rei(x) cin >> x
#define pri(x) cout << x
#define ms(x,y) memset(x,y,sizeof x)typedef pair<
int,
int> pii;
typedef pair<LL,LL> pll;
const int dx[
9] = {
0,
1,-
1,
0,
0,-
1,-
1,
1,
1};
const int dy[
9] = {
0,
0,
0,-
1,
1,-
1,
1,-
1,
1};
const double pi =
acos(-
1.0);
const int N =
510;LL a[N][N],hang[N],lie[N],he=-
1;
int n,sx,sy;
int main()
{ios::sync_with_stdio(
false);rei(n);
if (n==
1)
return pri(
1<<endl),
0;rep1(i,
1,n)rep1(j,
1,n){rei(a[i][j]);
if (!a[i][j])sx = i,sy = j;}rep1(i,
1,n){LL temp =
0;rep1(j,
1,n)temp+=a[i][j];hang[i] = temp;
if (sx==i)
continue;
if (he==-
1)he = temp;
elseif (he!=temp)
return pri(-
1<<endl),
0;}rep1(j,
1,n){LL temp =
0;rep1(i,
1,n)temp+=a[i][j];lie[j] = temp;
if (sy==j)
continue;
if (he!=temp)
return pri(-
1<<endl),
0;}
bool in1 =
false;LL he1 =
0;rep1(i,
1,n){
if (i==sx && i==sy) in1 =
true;he1+=a[i][i];}
if (!in1 && he1!=he)
return pri(-
1<<endl),
0;
if (in1 && he1!=hang[sx])
return pri(-
1<<endl),
0;
bool in2 =
false;LL he2 =
0;rep1(i,
1,n){
if (i==sx && n-i+
1==sy) in2 =
true;he2+=a[i][n-i+
1];}
if (!in2 && he2!=he)
return pri(-
1<<endl),
0;
if (in2 && he2!=hang[sx])
return pri(-
1<<endl),
0;
if (hang[sx]<he){pri(he-hang[sx]);}
elsepri(-
1<<endl);
return 0;
}
轉載于:https://www.cnblogs.com/AWCXV/p/7626444.html
總結
以上是生活随笔為你收集整理的【codeforces 711B】Chris and Magic Square的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。