开篇送给读者两句话:
一个人可以走的快,但一群人才可以走的远。
听不同的音乐,看不同的书,游历不同的城市,邂逅不同的人,思维和际遇有交集,亦有合集,走的多了,站的高了,自然就看的远了。
犹记初春实习面头条的时候,记得第一道题就是矩阵中的路径问题,大概是这样:有一个2*2的矩阵,有起点A和终点B,矩阵中有很多障碍物,代码实现从A到B的最短路径,这道题和我今天要说的矩阵的搜索路径有很大的相似之处,有心的读者可以试着自己想想思路。
回溯法
简单点,回溯法其实就是一种 枚举 + 优选 的过程,通过搜索尝试的过程中寻求问题的解,当发现当前不满足最优的时候,就退一步,重新找路。
基本思想:
对隐式图的深度优先搜索算法。
在包含问题的所有的解空间中,按照DFS搜索策略,从根节点(起始点)出发DFS搜索解空间树。当搜索到一个结点时,就先判断该结点是否包含问题的解:
若包含:沿着该节点出发继续DFS
若不包含:逐层向其祖先结点回溯
解题步骤:重要重要重要!
1. 针对问题,确定问题的解空间(至少包含问题的一个最优解)
2. 确定结点的扩展搜索规则
3. 以DFS搜索解空间,并在搜索过程中使用剪枝函数避免无效搜索。
举例1:矩阵中的路径
设计一个函数,用来判断再一个矩阵中是否存在一条包含 某个字符串中所有字符 的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向 上 下 左 右 移动一个格子。如果一条路径经过了矩阵中的某个格子,则之后就不能再次进入这个格子。例: