标签:offer65 rows int 路径 矩阵 cols str pathlength visited
题目描述
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如
矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。
深搜,回溯
用一个pathlength标记走的长度,也是为了指向str匹配到哪一个字符了
然后如果走到死胡同,即下面几个方向都没戏,那么pathlength--,取消刚才点的访问
class Solution { public: bool hasPath(char *matrix, int rows, int cols, char *str) { if (!matrix || rows < 1 && cols < 1 && !str) return false; //访问标记 bool *visited = new bool[rows * cols]; memset(visited, 0, rows * cols); int pathlength = 0; //路径长度 标记匹配到str的第几个字符 回溯用 for (int i = 0; i < rows; ++i) { for (int j = 0; j < cols; ++j) { if(matrix[i*cols+j]==*str){//找到可以开始的头 if (dfs(matrix, rows, cols, i, j, str, pathlength, visited)) return true; } } } delete[] visited; return false; } bool dfs(char *matrix, int rows, int cols, int i, int j, char *str, int &pathlength, bool *visited) { if (str[pathlength] == '\0') return true; bool haspath = false; //坐标合法 当前字符匹配 并且未访问过 if (i >= 0 && i < rows && j >= 0 && j < cols && matrix[i * cols + j] == str[pathlength] && !visited[i * cols + j]) { pathlength++; visited[i * cols + j] = true; haspath = dfs(matrix, rows, cols, i - 1, j, str, pathlength, visited) || dfs(matrix, rows, cols, i + 1, j, str, pathlength, visited) || dfs(matrix, rows, cols, i, j - 1, str, pathlength, visited) || dfs(matrix, rows, cols, i, j + 1, str, pathlength, visited); if (!haspath) { //四个方向都没有 回溯 取消访问标记 pathlength--; visited[i * cols + j] = false; } } return haspath; } };
标签:offer65,rows,int,路径,矩阵,cols,str,pathlength,visited 来源: https://www.cnblogs.com/Stephen-Jixing/p/13137809.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。