• 变量含义:
    hasPathCore(matrix,rows,cols,row,col,str,pathLength,visited):返回值代表是否找到。
    matrix:地图矩阵 str判断的字符串。
    pathLength:str字符串的下标。
    rows cols 地图的行跟列用来模拟二维访问。
    row,col:当前地图走到的行跟列。
    visited:标志是否访问

  • 递归出口:str[pathLength]=='\0'

  • 递归限制条件:
    row>=0&&row<rows&&col>=0&&col<cols 当前矩阵下标不能超过地图范围
    matrix[row*cols+col]==str[pathLength] 矩阵中该点元素等于str中的元素 才访问
    !visited[row*cols+col] 该点尚未访问。

  • 操作:
    pathLength++; // str标志位++
    visited[row*cols+col] = true; // 标记已经访问

  • 递归:对四个方向递归
    hasPathCore(matrix,rows,cols,row+1,col,str,pathLength,visited)
    hasPathCore(matrix,rows,cols,row,col+1,str,pathLength,visited)
    hasPathCore(matrix,rows,cols,row-1,col,str,pathLength,visited)
    hasPathCore(matrix,rows,cols,row,col-1,str,pathLength,visited);

  • 回溯:
    当四个方向都没找到时。回溯
    pathLength--; // str标识后退
    visited[row*cols+col] = false; //该点重新可以访问。

  • 初始化:
    要对每个点进行dfs。才能判断是否真不存在。

    class Solution {
    public:
       bool hasPath(string matrix, int rows, int cols, string str) {
           vector<bool> visited(rows*cols,0);
           int pathLength = 0;
           for(int row=0;row<rows;row++)
               for(int col=0;col<cols;col++)
               {
                   if(hasPathCore(matrix,rows,cols,row,col,str,pathLength,visited)) //对每个点为起点递归
                       return true;
               }
           return false;
       }
    
       bool hasPathCore(string matrix,int rows,int cols,int row,int col,string str,int& pathLength,vector<bool> visited)
       {
           if(str[pathLength]=='\0') // 递归出口,str全部访问完。
               return true;
           bool hasPath = false;
           if(row>=0&&row<rows&&col>=0&&col<cols&&matrix[row*cols+col]==str[pathLength]&&!visited[row*cols+col])
           {
               pathLength++;
               visited[row*cols+col] = true;
               hasPath = hasPathCore(matrix,rows,cols,row+1,col,str,pathLength,visited)||
                   hasPathCore(matrix,rows,cols,row,col+1,str,pathLength,visited)||
                   hasPathCore(matrix,rows,cols,row-1,col,str,pathLength,visited)||
                   hasPathCore(matrix,rows,cols,row,col-1,str,pathLength,visited);
               if(!hasPath) // 如何进入该格子,结果不存在。
               {
                   pathLength--; // 回溯
                   visited[row*cols+col] = false; // 回溯
               }
           }
           return hasPath;
       }
    };