题解:P10677 『STA - R6』inkar-usi

· · 题解

首先,第一个字母必定是矩阵中字典序最大的字母。

第二个字母,是第一个字母旁边字典序最大的字母。

第三个字母是第二个字母旁边字典序最大的字母,不难想到肯定是第一个字母,这样就回到了第一步。

由此可得循环节长度 \le 2,具体做法就是找到第一个字母(可能有多个),枚举这个字母的上、下、左、右并连接成一个字符串,找出字典序最大的字符串即可。

有时候答案只有一个字母。

最后,如果答案有两个字母且两个字母相同,输出一个就行。

小技巧:如果要把字符强制转换成字符串,可以让一个空串加上这个字符。

AC 代码:

#include<bits/stdc++.h>
using namespace std;
//#define int long long
#define I return
#define love 0
#define FIRESTARS ;
string ans,space;
int n,m,dx[]={0,1,0,-1},dy[]={1,0,-1,0};
char a[1005][1005],maxn=0;
signed main()
{
    cin.tie(0)->sync_with_stdio(0);
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++)
    {
        cin>>a[i][j];
        maxn=max(maxn,a[i][j]);
    }
    ans=space+maxn;
    for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++)
    if(a[i][j]==maxn)
    for(int k=0;k<4;k++)
    {
        int xx=dx[k]+i,yy=dy[k]+j;
        if(xx>=1&&yy>=1&&xx<=n&&yy<=m&&a[xx][yy]!='#')
        ans=max(ans,space+a[i][j]+a[xx][yy]);
    }
    if(ans.size()==1)cout<<ans;
    else
    {
        if(ans[0]==ans[1])cout<<ans[0];
        else cout<<ans;
    }
    I love FIRESTARS
}