zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    OpenCV3 for python3 学习笔记1
    OpenCV3 for python3 学习笔记2
    python3 requests获取某网站折线图上数据
    python BeautifulSoup的简单使用
    Python爬虫之Cookie和Session(转载)
    python 获取前一天或前N天的日期
    python 进程池pool简单使用
    GitHub for Windows简单使用
    Windows上的git、github部署及基本使用方法
    python unknown error: DevToolsActivePort file doesn't exist 问题解决
  • 原文地址:https://www.cnblogs.com/Ash-ly/p/5820502.html
Copyright © 2011-2022 走看看