非常蛋疼的一道模拟……昨天调试写的文件输出没改结果没有过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