ybt1212 LETTERS
ybt1212 LETTERS
【题目描述】
给出一个roe×col的大写字母矩阵,一开始的位置为左上角,你可以向上下左右四个方向移动,并且不能移向曾经经过的字母。问最多可以经过几个字母。
【输入】
第一行,输入字母矩阵行数R和列数S,1≤R,S≤20。
接着输出R行S列字母矩阵。
【输出】
最多能走过的不同字母的个数。
【输入样例】
3 6
HFDFFB
AJHGDH
DGAGEH
【输出样例】
6
【题解】
从0,0开始搜索,维护一个数组lt,存储当前路径中出现的字母。
之前出现的字母如果遍历到,就返回。
记录这个点出发到四个方向所能经过的最大字母的最大值,加上1(它本身的字母)返回给上级,这样就能找出最大值。
注意:
这道题求的是DFS数里,最大的根叶路径长度而不是整个DFS序中出现的所有字母。(血的教训)
#include<iostream>
#include<cstring>
using namespace std;
int xr[4] = { 0,1,0,-1 };
int yr[4] = { -1,0,1,0 };//操作记录
int T, n, m, ans = 0, a[100][100];
char ch;
bool lt[30];
int dfs(int x, int y) {//深搜
//cout << x << " " << y << " ";
if ((x < 0) || (y < 0)) {
return 0;
}
if ((x >= n) || (y >= m)) {
return 0;
}
if (lt[a[x][y]]) {
return 0;
}
int t=0;
lt[a[x][y]] = 1;
for (int i = 0; i < 4; i++) {
ans = dfs(x + xr[i], y + yr[i]);
if (t < ans) {
t = ans;
}
}
lt[a[x][y]] = 0;
return t+1;
}
int main() {
cin >> n >> m;//输入矩阵大小
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> ch;
a[i][j] = ch - 'A';
}
}
ans = dfs(0, 0);//从0,0的位置开始搜
cout << ans << endl;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)