剑指offer12:矩阵中的路径

题目:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 a b c e s f c s a d e e 矩阵中包含一条字符串”bcced”的路径,但是矩阵中不包含”abcb”路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。

思路:判断字符串是否包含在矩阵中,假设矩阵第[r][c]个元素与字符串第一个元素相等,则将字符串下一个可能出现的位置为[r+1][c],[r-1][c],[r][c+1],[r][c-1]中的一个,直到到str结尾’\0’. 当路径存在时就继续向下走,不存在就回退一步. 同时每个字母在一条路径中只能有一次,需要记住当前路径哪些被访问过. 回溯法

bool findPath(vector<vector<char>> matrix, int rows, int cols, int row, int col, char* str, int pathLength, vector<vector<int>> mask){
        if(str[pathLength]=='\0')
            return true;
        bool flag=false;
        if(row>=0 && col>=0 && row < rows && col < cols && matrix[row][col]==str[pathLength] && mask[row][col]==0){
            pathLength++;
            mask[row][col]=1;
            flag = findPath(matrix, rows, cols, row-1, col, str, pathLength, mask) ||
                   findPath(matrix, rows, cols, row+1, col, str, pathLength, mask) ||
                   findPath(matrix, rows, cols, row, col-1, str, pathLength, mask) ||
                   findPath(matrix, rows, cols, row, col +1, str, pathLength, mask);
           if(!flag){
               pathLength--;
               mask[row][col]=0;
           }
        }
        return flag;
    }
    
    bool hasPath(vector<vector<char>> matrix, int rows, int cols, char* str)
    {
        if(matrix.empty() || rows<1 || cols <1 || str==nullptr)
            return false;
        vector<vector<int>> mask(rows, vector<int>(cols, 0));
        int pathLength=0;
        for(int row=0; row< rows; row++)
            for(int col=0; col< cols; col++){
                if(findPath(matrix, rows, cols, row, col, str, pathLength, mask))
                    return true;
            }
        return false;
    }