原题链接:LETTERS
解题思路:
注意事项:
参考代码:
#include"bits/stdc++.h" using namespace std; // 定义全局变量r和s,kkk初始化为-1 int r, s, kkk = -1; // 定义字符数组f用于存储输入的矩阵 char f[21][21]; // 定义布尔数组lll用于标记字符是否被访问过 bool lll[200]; void dfs(int x, int y, int sum) { // 如果上方有未访问过的字符,则递归调用dfs if (x - 1 > 0 && !lll[f[x - 1][y]]) { lll[f[x - 1][y]] = 1; // 标记该字符已访问 dfs(x - 1, y, sum + 1); // 递归调用dfs lll[f[x - 1][y]] = 0; // 回溯,取消标记 } // 如果左侧有未访问过的字符,则递归调用dfs if (y - 1 > 0 && !lll[f[x][y - 1]]) { lll[f[x][y - 1]] = 1; // 标记该字符已访问 dfs(x, y - 1, sum + 1); // 递归调用dfs lll[f[x][y - 1]] = 0; // 回溯,取消标记 } // 如果下方有未访问过的字符,则递归调用dfs if (x + 1 <= r && !lll[f[x + 1][y]]) { lll[f[x + 1][y]] = 1; // 标记该字符已访问 dfs(x + 1, y, sum + 1); // 递归调用dfs lll[f[x + 1][y]] = 0; // 回溯,取消标记 } // 如果右侧有未访问过的字符,则递归调用dfs if (y + 1 <= s && !lll[f[x][y + 1]]) { lll[f[x][y + 1]] = 1; // 标记该字符已访问 dfs(x, y + 1, sum + 1); // 递归调用dfs lll[f[x][y + 1]] = 0; // 回溯,取消标记 } // 更新最大路径长度 kkk = max(kkk, sum); } int main() { // 读取矩阵的行数和列数 cin >> r >> s; // 读取矩阵内容 for (int i = 1; i <= r; i++) { for (int j = 1; j <= s; j++) { cin >> f[i][j]; } } // 标记起始点字符已访问 lll[f[1][1]] = 1; // 从起始点开始进行深度优先搜索 dfs(1, 1, 1); // 输出最大路径长度 cout << kkk << endl; return 0; }
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复