洛谷P10677题解

题目描述

给一个 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;
}
相关推荐
秋天的怀念_David6 小时前
算法一千零一夜 · 第十七夜 长街点灯
java·程序人生·算法
鶴哥只手遮天6 小时前
AFSIM 2.9.0 深度解析:架构、原理与工程实践-第 1 章 项目全景与代码地图
c++
CV爱数码6 小时前
论文精读|RED-CNN:残差编解码网络,低剂量 CT 去噪的经典基线
网络·人工智能·算法·cnn·ct·重建·x-ray
充值内卷6 小时前
C++单文件迷宫游戏:TauriCPP 开发全记录
开发语言·c++·游戏
Antruly6 小时前
C++ Web 开发选型漫谈:从 Drogon 到 libuvcpp + uvp,八个项目的定位、兼容性与务实排名
开发语言·前端·c++
JustNow_Man7 小时前
【Harness】本地文本向量化搜索解决方案--qmd
git·python·算法
another heaven7 小时前
【C/C++ C++ 新特性中的那些内存优化的特性】
c语言·开发语言·c++
敲代码的苦137 小时前
头歌 数据结构—消防资源调度
数据结构·算法
ysu_03147 小时前
【C++ 进阶之路】(二)从内联函数到类与对象:深挖内存对齐、this 指针与三大默认成员函数
开发语言·数据结构·c++·笔记·面向对象·this
布莱克6057 小时前
C++ 中 set 与 map 的区别详解
开发语言·c++·算法·哈希