变量含义:
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; } };