首先在矩阵中任意选取一个格子作为起点。假设矩阵中某个格子的字符为ch,并且这个格子对应于路径上的第i个字符。如果路径上的第i个字符不是ch,那么这个格子不可能处在路径的第i个位置上。如果路径的第i个字符恰好是ch,那么到相邻的格子上寻找第i+1个字符。重复这个过程直到路径上的所有字符都在矩阵中找到相应的位置。由于回溯法的递归特性,路径可以被看做一个栈。
解题注意事项:
(1)应该有一个布尔值矩阵来记录矩阵的哪些格子已经被使用过了
(2)使用递归的方式求解。在使用递归的时候应该注意,在退出递归的时候需要根据需求对计数或者标志进行回退或者清除等操作。
1 class Solution { 2 public: 3 bool hasPathCore(const char *matrix, int rows, int cols, int row, int col, const char *str, int &pathLen, bool *visited) 4 { 5 //一定注意开头两个判定的顺序,如果str已经全部监测了,那么就直接返回true,不需要进行下一步检测 6 if (str[pathLen] == ‘\0‘)return true; 7 8 //需要进一步检测才检查状态对不对 9 if ((row < 0) || (col < 0) || (row >= rows) || (col >= cols) || (visited[row*cols + col]))return false; 10 11 bool resu = false; 12 //检查当前字符是否满足 13 if (matrix[row*cols + col] == str[pathLen]){ 14 pathLen++; 15 visited[row*cols + col] = true; 16 17 resu = hasPathCore(matrix, rows, cols, row + 1, col, str, pathLen, visited) || 18 hasPathCore(matrix, rows, cols, row - 1, col, str, pathLen, visited) || 19 hasPathCore(matrix, rows, cols, row, col - 1, str, pathLen, visited) || 20 hasPathCore(matrix, rows, cols, row, col + 1, str, pathLen, visited); 21 22 //如果resu为假,当前格子不可能处在路径的第pathLen个位置上(所有可能性都检查了) 23 if (!resu){ 24 pathLen--; //从当前分支退出,把pathLength减回去,visited清空 25 visited[row*cols + col] = false; 26 } 27 } 28 return resu; 29 } 30 31 bool hasPath(char* matrix, int rows, int cols, char* str) 32 { 33 if ((matrix == NULL) || (rows <= 0) || (cols <= 0) || (str == NULL)){ 34 return false; 35 } 36 37 bool *visited = (bool *)malloc(rows*cols); 38 //bool *visited = new bool[rows * cols]; //记录当前路径已访问的节点 39 memset(visited, false, rows*cols); 40 41 bool resu; 42 int pathLen = 0; 43 //遍历所有可能的入口,发现第一条路径时就结束 44 for (int i = 0; i != rows; i++){ 45 for (int j = 0; j != cols; j++){ 46 if (hasPathCore(matrix, rows, cols, i, j, str, pathLen, visited)){ 47 free(visited); 48 return true; 49 } 50 } 51 } 52 free(visited); 53 return false; 54 } 55 };
https://blog.csdn.net/m0_37950361/article/details/80546981
原文:https://www.cnblogs.com/wxwhnu/p/11439901.html