1. 问题背景与核心思路
UVA-11882 "最大的数"是一道经典的图论搜索问题,要求在一个二维矩阵中找到一条数字序列最长的路径。路径需要满足相邻格子必须上下左右相连,且不能重复经过同一个格子。这道题出自《算法竞赛入门经典(第二版)》,是DFS(深度优先搜索)算法的典型应用场景。
我第一次看到这个问题时,直觉反应就是暴力DFS遍历所有可能的路径。但很快意识到当矩阵尺寸较大时(比如30x30),这种做法的计算量会呈指数级增长。于是开始思考如何优化这个基础方案。
核心解题思路可以分解为三个关键步骤:
- 从每个非零数字格子出发,进行四方向DFS探索
- 记录当前路径的数字序列和长度
- 通过比较机制保存数值最大的最长路径
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 算法实现细节解析
2.1 数据结构设计
代码中使用了几个关键数据结构:
arr[32][32]:存储输入矩阵,0表示障碍物,1-9表示有效数字findArr[32][32]:DFS访问标记数组,防止重复访问maxNum[35]和tempNum[35]:分别存储最终结果和当前路径的数字序列Steps[4][2]:定义四个移动方向(右、左、下、上)
这种设计考虑了UVA题目的典型输入规模(最大30x30),数组大小适当留有余量。使用一维数组存储路径而非字符串,减少了频繁的字符串操作开销。
2.2 DFS核心逻辑
dfs函数是算法的心脏部分,其工作流程如下:
- 将当前格子数字存入
tempNum,标记为已访问 - 向四个方向探索:
- 检查边界条件
- 跳过障碍物和已访问格子
- 当无路可走时,调用
compareMax比较当前路径
特别注意这里的回溯处理:在递归返回前需要清除访问标记(findArr[x][y] = 0),这是DFS算法的关键特性,确保不同路径可以重复利用格子。
2.3 路径比较机制
compareMax函数实现了题目要求的特殊比较规则:
- 优先比较路径长度,更长的直接胜出
- 长度相同时,逐位比较数字大小
- 只有找到严格更大的序列时才更新结果
这种比较方式确保了最终结果既是可能的最长路径,也是所有等长路径中数值最大的那个。
