P6338 题解

· · 题解

题面

题意

找到并输出长度至少为 2 的字母串。

思路

暴力枚举每一个位置,看它是否能够成为字母串的开头。

如果可以,就取这个字母串,并与上次答案取最小。

具体细节请看代码。

代码

#include<bits/stdc++.h>
using namespace std;
int n,m,i,j,y;
char a[25][25];
string x,ans="{";//既然最大字母是z,就取一个比z大的字符{作为初始最大值即可
int main(){
    cin>>n>>m;
    for(i=0;i<=n;i++)a[i][0]='#';//初始化,围一圈栅栏,否则会导致下面判断字母串的开头时错误 
    for(i=0;i<=m;i++)a[0][i]='#';
    for(i=1;i<=n;i++)cin>>a[i]+1;
    for(i=1;i<=n;i++)//暴力枚举每一个位置 
        for(j=1;j<=m;j++){
            if(a[i][j]>='a'&&a[i][j]<='z'&&a[i][j-1]=='#'){//是从左到右的字母串的开头 
                x="";y=j;
                while(y<=m&&a[i][y]!='#')x=x+a[i][y++];//往右取,直到出现#或出界结束
                if(x.size()>=2)ans=min(ans,x);//长度至少为2 
            }
            if(a[i][j]>='a'&&a[i][j]<='z'&&a[i-1][j]=='#'){//是从上到下的字母串的开头 
                x="";y=i;
                while(y<=n&&a[y][j]!='#')x=x+a[y++][j];//往下取 
                if(x.size()>=2)ans=min(ans,x);
            }
        }
    cout<<ans;
    return 0; 
}