题解:B4059 [语言月赛 202411] Enemy
本题考察内容非常广,涵盖顺序、分支、循环结构,以及字符数组、变量的使用等,考察选手的综合运用能力。
首先是激战环节:
对于每一行,设 A 的数量为 B 的数量为
- 有城墙
则这一行的前 A,后 B,H 的位置不变,剩下的变为 #。
- 没有城墙
则按照题意模拟,如果 #,否则,若 A,剩下的变为 #。若 B,剩下的变为 #。
然后得到了激战后的局面,接下来是输出阶段。
则直接输出即可。
则需判断 #,否则直接输出
注意每行输出后要换行。
这题码量在入门赛中较大,也有实现细节。代码如下:
#include<bits/stdc++.h>
using namespace std;
char c[1005][1005];
int n,m;
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin>>c[i][j];
for(int i=1;i<=n;i++){
int ca=0,cb=0,ch=0;
for(int j=1;j<=m;j++){
if(c[i][j]=='A')ca++;
else if(c[i][j]=='B')cb++;
else if(c[i][j]=='H')ch++;
}
if(ch){
for(int j=1;j<=m;j++)if(c[i][j]!='H')c[i][j]='#';
for(int j=1;j<=ca;j++)c[i][j]='A';
for(int j=m-cb+1;j<=m;j++)c[i][j]='B';
}else {
if(ca==cb)for(int j=1;j<=m;j++)c[i][j]='#';
else if(ca>cb){
for(int j=1;j<=m;j++)c[i][j]='#';
for(int j=m-ca+1;j<=m;j++)c[i][j]='A';
}else {
for(int j=1;j<=m;j++)c[i][j]='#';
for(int j=1;j<=cb;j++)c[i][j]='B';
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(c[i][j]=='#'||c[i][j]=='H')cout<<c[i][j];
else {
bool fl=0;
if(i>1)fl|=c[i-1][j]==c[i][j];
if(i<n)fl|=c[i+1][j]==c[i][j];
if(fl)cout<<"#";
else cout<<c[i][j];
}
}
cout <<'\n';
}
return 0;
}