※剑指offer系列54:矩阵中的路径
Posted neverland0718
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了※剑指offer系列54:矩阵中的路径相关的知识,希望对你有一定的参考价值。
这个题目用的是回溯法。
之前回溯法练得比较少,所以这个题还是需要重视。
回溯法是算法里学过的,就是从第一个可能得路径开始找,一直找到最后一个。
这个题目要注意一下几点:
1.从第一个开始找,如果第一个元素等于要寻找的字符串的第一个元素,就继续去寻找该元素的上下左右,看是否等于其下一个。一直匹配到最后一个元素。
2.如果这个元素的下一个在它的上下左右都找不到,就返回上一层,说明该元素也许走错了。
3.因为访问过得路径不能再次访问,因此要建立一个同样大小的bool型的变量记录该当前位置是否已经走过。
1 class Solution 2 public: 3 bool hasPath(char* matrix, int rows, int cols, char* str) 4 5 if (matrix == NULL || rows <= 0 || cols <= 0 || str == NULL) 6 return false; 7 8 bool* visited = new bool[rows*cols];//定义一个跟矩阵同样大小的变量,记录每个位置是否被访问过 9 memset(visited, 0, rows*cols); 10 11 int index = 0; 12 for(int i=0;i<rows;i++) 13 for (int j = 0; j < cols; j++) 14 15 if (hasPathcore(matrix, rows, cols, i, j,str, index, visited)) 16 return true; 17 18 delete[]visited; 19 return false; 20 21 bool hasPathcore(char* matrix, int rows, int cols, int row,int col,char* str,int index,bool *visit) 22 23 if (str[index] == ‘\0‘)//递归终止条件,一直寻找到了结尾 24 return true; 25 bool has=false; 26 if (row <= rows&&col <= cols&&matrix[row*cols + col] == str[index] && !visit[row*cols + col]) 27 28 visit[row*cols + col] = true; 29 index++; 30 //寻找字符串中剩下的 31 has = hasPathcore(matrix, rows, cols, row, col+1, str, index, visit)//右 32 || hasPathcore(matrix, rows, cols, row+1, col, str, index, visit)//下 33 || hasPathcore(matrix, rows, cols, row, col-1, str, index, visit)//左 34 || hasPathcore(matrix, rows, cols, row-1, col, str, index, visit);//上 35 36 if (!has)//上下左右都没找到下一个元素,说明该元素走错了,退回上一步 37 38 index--; 39 visit[row*cols + col] = false; 40 41 42 43 return has; 44 45 46 47 ;
以上是关于※剑指offer系列54:矩阵中的路径的主要内容,如果未能解决你的问题,请参考以下文章
剑指 Offer(C++版本)系列:剑指 Offer 12 矩阵中的路径