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

封面

思路:

看题,需要在矩阵上找出一条起始点任意的路径(可以重复经过某个格子),使得字典序最大。

那么通过可以重复这四个字我们可以知道最后求出的字符串的长度一定是小于等于二的。

所以,我们可以在输入时查找最大的字母(为了保证字典序最大)用一个变量 cc 存下来,输入完之后,历遍矩阵,当历遍到的字母为我们找到的最大的字母时,查找他上下左右四个方向的最大的字母,然后用 chch 存下来。

最后在循环结束后在 ccchch 不相同时输出 chch 就可以了,相同的情况就不要输出了。

代码:

#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define itn int
#define ull unsigned long long
int n,m;
char ch;
char jz[1500][1500];
int dx[]={1,-1,0,0},dy[]={0,0,-1,1};
int main(){
int mx=0,my=0;
char c='A'-1;
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>jz[i][j];if(jz[i][j]!='#')if(jz[i][j]>c)c=jz[i][j];// 输入并查找最大的字母
}
}
cout<<c;// 为了保证字典序最大第一个字母一定是最大的可以直接输出
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(jz[i][j]!='#')if(jz[i][j]==c){
mx=i;my=j;
for(int i=0;i<4;i++){
int tx=mx+dx[i],ty=dy[i]+my;
if(tx<1||ty<1||tx>n||ty>m)continue;
if(jz[tx][ty]=='#')continue;
if(ch<jz[tx][ty])ch=jz[tx][ty];
}
}
}
}
if(ch!=c)cout<<ch;// 在不相等的时候才输出不然会输出两个相同的字母,如果不这样写就不满足题目中如果答案是无限的,只需输出它的最短循环节
return 0;
}