Codeforces Round #369 (Div. 2) A B 两水题 编码能力

A题:




水。。直接代码:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
string save[1010];
int main(){
    int n,i,j;
    scanf("%d",&n);
    string t;
    int flag = false;
    for(i=1;i<=n;i++){
        cin>>save[i];
        if((save[i][0]=='O'&&save[i][1]=='O')||(save[i][3]=='O'&&save[i][4]=='O')){
            if(!flag){
                if(save[i][0]=='O'&&save[i][1]=='O'){
                    save[i][0]='+';
                    save[i][1]='+';
                }else{
                    save[i][3]='+';
                    save[i][4]='+';
                }
            }
            flag = true;
        }
    }
    if(flag){
        printf("YES\n");
        for(i=1;i<=n;i++){
            cout<<save[i]<<endl;
        }
    }else{
        printf("NO\n");
    }
    return 0;
}
B题:



题目给一个n*n的矩阵,其中某个位置的数为0,这事我们要填的位置,保证其它位置的数字都为正整数。我们填的数字也必须为正整数,填上数字后要求这个矩阵每一行、每一列、两条对角线的的和要想等,如果不存在这样的数字,就输出-1。

题意很明确。。。是自己的编码能力不足。。。

首先先检查除去含零的列和行还有对角线是否相等,如果不等则直接判-1.

然后随便找一行来对比含0行找出要填的数字,填上后再检查一遍这个矩阵是否合法

。。。。感觉自己好腊鸡啊。。什么时候div能稳做三题呢。。

下面代码:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
const int maxn=510;
const long long prime = 10000019;
int n,i,j;
long long save[maxn][maxn];
bool judge(){
    long long now=0,sum=0;
    bool flag = true;
    bool can=true;
    for(i=1;i<=n;i++){
        if(can){
            now = sum;
        }
        sum = 0;
        can = true;
        for(j=1;j<=n;j++){
            if(save[j][i]==0){
                can = false;
            }
            sum = (sum+save[j][i])%prime;
        }
        if(can){
            if(now!=sum&&now!=0){
                flag =false;
                return false;
            }
        }
    }
    return  true;
}
long long result(int i0){
    int it;
    if(i0>1){
        it=1;
    }else if(i0==n){
        it = 1;
    }else{
        it = n;
    }
    long long add=0;
    for(i=1;i<=n;i++){
        add += save[it][i]-save[i0][i];
    }
    return add;
}
int main(){
    scanf("%d",&n);
    int i0,j0;
    if(n==1){
        printf("1\n");
        return 0;
    }
    long long now=0,sum=0;
    bool flag = true;
    bool can=true;
    for(i=1;i<=n;i++){
        if(can){
            now = sum;
        }
        sum = 0;
        can = true;
        for(j=1;j<=n;j++){
            scanf("%I64d",&save[i][j]);
            if(save[i][j]==0){
                i0=i,j0=j;
                can = false;
            }
            sum = (sum+save[i][j])%prime;
        }
        if(can){
            if(now!=sum&&now!=0){
                flag =false;
            }
        }
    }
    if(flag){
        long long sum1 = 0;
        long long sum2 = 0;
        bool can=true;
        for(i=1;i<=n;i++){
            if(save[i][i]==0){
                can =false;
                break;
            }
            sum1 = (sum1+save[i][i])%prime;
        }
        for(i=1;i<=n;i++){
            if(save[i][n-i+1]==0){
                can =false;
                break;
            }
            sum2 = (sum2+save[i][n-i+1])%prime;
        }
        if(sum1!=sum2&&can){
            printf("-1\n");
        }else if(sum1!=now&&can){
            printf("-1\n");
        }else{
            if(judge()){
                if(result(i0)>0){
                    long long answer = result(i0);
                    save[i0][j0]=result(i0);
                    sum1=0,sum2=0;
                    for(i=1;i<=n;i++){
                        sum1 = (sum1+save[i][i])%prime;
                        sum2 = (sum2+save[i][n-i+1])%prime;
                    }
                    if(n==2){
                        if(sum1==sum2&&judge()){
                            if(answer>0){
                                printf("%I64d\n",answer);
                                return 0;
                            }else{
                                printf("-1\n");
                            }
                        }
                    }
                    if(sum1==sum2&&sum1==now&&judge()){
                        if(answer>0){
                            printf("%I64d\n",answer);
                        }else{
                            printf("-1\n");
                        }
                    }else{
                        printf("-1\n");
                    }
                }else{
                    printf("-1\n");
                }
            }else{
                printf("-1\n");
            }
        }
    }else{
        printf("-1\n");
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值