Q12矩阵中的路径 回溯法

回朔法

矩阵中的路径

题目

请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 [ a b c e s f c s a d e e ] \begin{bmatrix} a & b & c &e \\ s & f & c & s \\ a & d & e& e\\ \end{bmatrix}\quad

矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。

思路

回溯法

实现

  • 记得写visistMtx的释放语句,delete
  • 进行下一个判断钱,将visit置true,如果不匹配,重新置回false。
class Solution {
public:
    bool hasPath(char* matrix, int rows, int cols, char* str)
    {
        if(matrix==nullptr || rows<1 || cols<1 || str==nullptr)
            return false;
        
        bool* visitMatrix = new bool[rows*cols];
        memset(visitMatrix, false, rows*cols);
        
        for(int r=0; r<rows; ++r)
        {
            for(int c=0; c<cols; ++c)
            {
                int pathLen = 0;
                if(hasPathCore(matrix, rows, cols, str, pathLen, visitMatrix, r, c))
                    return true;
            }
        }
        delete[] visitMatrix; //!!记得写delete
        return false;
    }
    
    //pathLen没有设计成引用
    bool hasPathCore(char* matrix, int rows, int cols, 
                     char* str, int pathLen, bool* visitMtx, int r, int c)
    {
        char tag = str[pathLen];
        if (tag=='\0') return true;
        ++pathLen;
        
        bool hasMatch = false;
        if(r<rows && r>=0 && c<cols && c>=0 && !visitMtx[r*cols+c] && matrix[r*cols+c]==tag)
        {
            visitMtx[r*cols+c] = true;
            
            hasMatch = hasPathCore(matrix, rows, cols, str, pathLen, visitMtx, r+1, c)
                || hasPathCore(matrix, rows, cols, str, pathLen, visitMtx, r-1, c)
                || hasPathCore(matrix, rows, cols, str, pathLen, visitMtx, r, c+1)
                || hasPathCore(matrix, rows, cols, str, pathLen, visitMtx, r, c-1);
            
            if(!hasMatch)
                visitMtx[r*cols+c] = false;
        }
        return hasMatch;
    }
};
发布了48 篇原创文章 · 获赞 10 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/mhywoniu/article/details/104932990