题解:B4059 [语言月赛 202411] Enemy

· · 题解

本题考察内容非常广,涵盖顺序、分支、循环结构,以及字符数组、变量的使用等,考察选手的综合运用能力。

首先是激战环节:

对于每一行,设 A 的数量为 cA,B 的数量为 cB

则这一行的前 cA 个字符变为 A,后 cB 个字符变为 BH 的位置不变,剩下的变为 #

则按照题意模拟,如果 cA=cB,则这一行全部变为 #,否则,若 cA>cB,则右边的 cA 个变为 A,剩下的变为 #。若 cA<cB,则左边的 cB 个变为 B,剩下的变为 #

然后得到了激战后的局面,接下来是输出阶段。

则直接输出即可。

则需判断 s_{i-1,j}s_{i+1,j} 中是否存在与 s_{i,j} 相等的,如果存在,则输出 #,否则直接输出 s_{i,j} 即可。

注意每行输出后要换行。

这题码量在入门赛中较大,也有实现细节。代码如下:

#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;
}