Codeforces 711B. Chris and Magic Square

题目链接:http://codeforces.com/problemset/problem/711/B

题意:

  给你一个n * n 的矩阵, 其中除了含有一个 ”0“ 以外, 都是正整数, 问你是否存在一个大于 0 的数, 使得这个数取代 ”0“ 的位置后, 这个矩阵每行, 每列, 主副对角线上的数加起来全部都相等.

思路:

把这个矩阵的每行每列还有主副对角线的数全部加起来存在一个sum数组里,且这个数组应该有 n * 2 + 2 个数, 排序后分情况讨论:

  情况1:如果这个 ”0“ 既在主对角线上也在副对角线上, 那么排序后前4个数应该相等,其余的 (n * 2 + 2) - 4 个数也必须全部相等.

  情况2:如果这个 ”0“ 在主对角线和副对角线其中一个上, 那么排序后前3个数应该相等,其余的 (n * 2 + 2) - 3 个数也必须全部相等.

  情况3:如果这个 ”0“ 不在对角线上, 那么排序后前2个数应该相等,其余的 (n * 2 + 2) - 2 个数也必须全部相等.

这里需要特判一下 n = 1 的时候, 不应该输出 0, 随便输出一个正整数即可.还有种情况就是给的矩阵已经满足条件,即行, 列, 对角线加起来全部相等, 说明本身的 ”0“ 已经满足情况, 这时不存在一个正整数去替代这个 ”0“.

代码:

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 const int MAXN = 500;
 6 typedef long long LL;
 7 const double PI = acos(-1);
 8 LL a[MAXN + 3][MAXN + 3];
 9 
10 void input(int &x,int &y, int n) {
11     for(int i = 0; i < n; i++) {
12         for(int j = 0; j < n; j++) {
13             cin >> a[i][j];
14             if(a[i][j] == 0) x = i, y = j;
15         }
16     }
17 }
18 
19 LL sum[MAXN * 2 + 7];
20 bool check(int st, int ed) {
21     for(int i = st; i < ed; i++) if(sum[i] != sum[i - 1]) return false;
22     return true;
23 }
24 
25 int main() {
26     ios_base::sync_with_stdio(0); cin.tie(0);
27     int n; cin >> n;
28     int inx = -1, iny = -1;
29     input(inx, iny, n);
30     if(n == 1) {
31         cout << (LL) 1e18 - 1 << endl;
32         return 0;
33     }
34     int len = 0;
35     for(int i = 0; i < n; i++) {
36         for(int j = 0; j < n; j++) {
37             sum[len] += a[i][j], sum[len + 1] += a[j][i];
38         }
39         len += 2;
40     }
41     for(int i = 0; i < n; i++) sum[len] += a[i][i], sum[len + 1] += a[i][n - i - 1];
42     len += 2;
43     sort(sum, sum + len);
44     int end = -1;
46     if(n % 2 != 0 && inx == iny && inx == n / 2) end = 4;//分三种情况讨论
47     else if(inx == iny || inx == n - 1 - iny) end = 3;
48     else end = 2;
49     int flag = 0;
50     if(check(1, end) && check(end + 1, len)) flag = 1; // 前后各部分的数要都相等
51     if(flag == 1) cout<< (sum[len - 1] - sum[0] == 0 ? -1 : sum[len - 1] - sum[0]) << endl;
52     else cout << -1 << endl;
53     return 0;
54 }
原文地址:https://www.cnblogs.com/Ash-ly/p/5820502.html