• 【codeforces 711B】Chris and Magic Square


    【题目链接】: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()
    {
        //freopen("F:\rush.txt","r",stdin);
        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;
            else
                if (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]);
        }
        else
            pri(-1<<endl);
        //printf("
    %.2lf sec 
    ", (double)clock() / CLOCKS_PER_SEC);
        return 0;
    }
  • 相关阅读:
    JavaScript入门基础(三)
    JavaScript入门基础(二)
    Web页面该如何布局
    如何通过SQL创建删除表的索引,UNIQUE KEY
    vim使用大全
    安装vmwaretools后 真机和虚拟机仍不能复制黏贴
    php通用函数html时间文件大小生成随机数
    Centos下安装配置phpmyadmin
    [Leetcode 43] 11 Container With Most Water
    [Leetcode 39] 129 Sum Root to Leaf Numbers
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7626444.html
Copyright © 2020-2023  润新知