【剑指offer65 矩阵中的路径】

题目描述

请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。
例如
 

 

矩阵中包含一条字符串"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;
    }
};

 

posted @ 2020-06-15 21:01  Stephen~Jixing  阅读(156)  评论(0编辑  收藏  举报