codeforces837B Flag on Berland

非常蛋疼的一道模拟……昨天调试写的文件输出没改结果没有过orz


题意大概是这样的:有一个国旗,由三种颜色’R”G”B’构成,要求这三种颜色将国旗分为等宽的3条,这些条可以是横的,可以是竖的,输入长、宽和国旗形状问是否满足。
那么我们可以分四种情况讨论:长宽都不是3的倍数,则一定不满足;长是3的倍数而宽不是,则从长判断;宽是而长不是,则从宽判断;长宽都是,那就分别立两个flag判断。判断方法大同小异,所以我写了个比较臃肿的代码。

#include <bits/stdc++.h>
using namespace std;
#define MAXN 103
char a[MAXN][MAXN];
int main(){
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;++i)
        for(int j=1;j<=m;++j)
            cin>>a[i][j];
    if(n%3!=0&&m%3!=0){
        cout<<"No"<<endl;
    }
    else if(n%3==0&&m%3!=0){
        int p=n/3;
        for(int i=1;i<=n;++i){
            for(int j=1;j<=m;++j){
                if(j>1)
                    if(a[i][j]!=a[i][j-1]){//每一横条相等
                        cout<<"No"<<endl;
                        return 0;
                    }
                if(i%p!=1&&p!=1)
                    if(a[i][j]!=a[i-1][j]){//相邻n/3个竖条相等
                        cout<<"No"<<endl;
                        return 0;
                    }
            }

        }
        cout<<"Yes"<<endl;
    }
    else if(n%3!=0&&m%3==0){
        int p=m/3;
        for(int i=1;i<=n;++i){
            for(int j=1;j<=m;++j){
                if(i>1)
                    if(a[i][j]!=a[i-1][j]){
                        cout<<"No"<<endl;
                        return 0;
                    }
                if(j%p!=1&&p!=1)
                    if(a[i][j]!=a[i][j-1]){
                        cout<<"No"<<endl;
                        return 0;
                    }
            }
        }
        cout<<"Yes"<<endl;        
    }
    else{
        int p=n/3,q=m/3;
        bool flag1=true,flag2=true;
        for(int i=1;i<=n;++i){
            for(int j=1;j<=m;++j){

                if(flag1&&j>1)
                    if(a[i][j]!=a[i][j-1]){
                        flag1=false;
                    }
                if(flag1&&i%p!=1&&p!=1)
                    if(a[i][j]!=a[i-1][j]){
                        flag1=false;
                    }
                if(flag2&&i>1)
                    if(a[i][j]!=a[i-1][j]){
                        flag2=false;
                    }
                if(flag2&&j%q!=1&&q!=1)
                    if(a[i][j]!=a[i][j-1]){
                        flag2=false;
                    }
                if((!flag1)&&(!flag2)){
                    cout<<"No"<<endl;
                        return 0;
                    }
            }               
        }
    cout<<"Yes"<<endl; 
    }
    return 0;    
}

果然模拟超级锻炼代码能力啊orz

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值