题目描述
给一个 n × m n\times m n×m 的字符矩阵,有些位置有障碍(记为字符 #
),需要在矩阵上找出一条起始点任意的路径(可以重复经过某个格子),使得字典序最大。
可以证明答案一定是有限的或者是由某个长度有限的字符串 S S S 不断重复得到的。如果答案是有限的,直接输出之;如果答案是无限的,只需输出它的最短循环节。
输入格式
第一行两个正整数 n , m n,m n,m。
后 n n n 行,每行一个长度为 m m m 的字符串,描述矩阵的第 n n n 行。
输出格式
一行一个字符串,表示答案。
样例 #1
样例输入 #1
3 3
###
#A#
###
样例输出 #1
A
样例 #2
样例输入 #2
3 4
####
#AB#
####
样例输出 #2
BA
样例 #3
样例输入 #3
3 4
####
#AA#
####
样例输出 #3
A
提示
本题采用捆绑测试。
数据范围:
- Subtask 1 (20pts):字符矩阵中除了障碍就是字母
A
。 - Subtask 2 (30pts): n , m ≤ 3 n,m\le 3 n,m≤3。
- Subtask 3 (50pts):无特殊限制。
对于全部数据, 1 ≤ n , m ≤ 1 0 3 1\le n,m\le 10^3 1≤n,m≤103,所有非障碍字符都是大写字母,矩阵至少有一个非障碍格。
思路
显然,为求最大字典序,答案路径一定是从最大的字符开始,再在其旁边找一个最大的字符,但在旁边的字符继续找时,一定会找回那个最大的字符,所以答案一定不超过两个字符,暴力枚举所有最大字符即可,输出时再特判存在两个相邻最大字符的情况。
AC Code
cpp
#include<bits/stdc++.h>
using namespace std;
char c[1005][1005], mx, ch;
int n, m, dx[]={0, 0, -1, 1}, dy[]={1, -1, 0, 0};
int main () {
cin >> n >> m;
for (int i=1; i<=n; i++)
for (int j=1; j<=m; j++)
cin >> c[i][j],
mx=max(mx, c[i][j]);
for (int i=1; i<=n; i++)
for (int j=1; j<=m; j++)
if (c[i][j]==mx)
for (int k=0; k<4; k++) {
int x=i+dx[k], y=j+dy[k];
if (x>=1&&x<=n&&y>=1&&y<=m&&c[x][y]!='#')
ch=max(ch, c[x][y]);
}
if (mx!=ch)
cout << mx;
cout << ch;
return 0;
}