【矩阵路径】不知道回溯怎么写?进来看模板就对了!
这几天做了几道回溯算法的题目,发现理解递归关键步骤的结果很重要,试图摸索出一套模板,思考的方法都是搭建好框架,然后逐步细想。先让我们看看道简单的回溯算法题目,一步步慢慢来:
1.矩阵路径
题目描述:
我们一步步来分析:
首先用两个for循环找到起始位置,代码如下:
bool exist(vector<vector<char>>& board, string word) {
if(word.empty())
return true;
rows=board.size();
cols=board[0].size();
for(int i=0;i<rows;i++)
for(int j=0;j<cols;j++)
{
if(hasPathCore(board,word,i,j,0))
return true;
}
return false;
}
难理解的是hasPathCore这个回溯函数。
第一步,找出函数退出的条件(成功退出,失败退出)
失败的退出条件:越界,字符不匹配
if(row>=rows || col>=cols || row<0 || col<0 ||word[pathLength]!=board[row][col])
return false;
成功退出的条件:查找到底部(适用于绝大多数的回溯算法)
if(pathLength==word.size()-1)//查找到最后,或者已近查找过了返回真
return true;
第二步,写出下一步递归的条件
此时,我们已经正确查找到了以一个字符的位置,接下来对他的上下左右进行查找,我们可以把它想象为一棵4叉树,就是每个节点有4个子节点,而树的遍历我们最容易想到的就是递归,我们来大概看一下:
boolean dfs(char[][] board, char[] word, int row, int col, int pathLength) {
if (边界条件的判断