troubleasy

导航

 

请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。

路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。

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

    bool hasPath(char* matrix, int rows, int cols, char* str)
    {
        //find str[0]
        vector<vector<bool > >mat(rows);
        for(int i=0;i<rows;i++)
        {
            mat[i].resize(cols);
            
        }
        bool res=false;
        for(int i=0;i<rows;i++)
        {
            for(int j=0;j<cols;j++)
            {
                if(*(matrix+i*cols+j)==str[0])
                {
                    
                    res=res||hasString(matrix,mat,str,rows,cols,i,j,0);
                    for(int i=0;i<rows;i++)
                    {
                        for(int j=0;j<cols;j++)
                            {
                            mat[i][j]=0;
               
                        }
                    }
                }
            }
        }
        return res;
        //traverse matrix
    }
    bool hasString(char* matrix,vector<vector<bool>>& mat,char* str,int rows,int cols,int r,int c,int i)
    {
        
        if(r<0||c<0||r>=rows||c>=cols||mat[r][c]||*(matrix+r*cols+c)!=str[i]) return false;
        if(*(matrix+r*cols+c)==str[i]&&str[i+1]=='\0')
            return true;
           //four direction
        mat[r][c]=true;
        bool res;
        res=hasString(matrix,mat,str,rows,cols,r-1,c,i+1);
        if(res==false)
        {
            res=hasString(matrix,mat,str,rows,cols,r+1,c,i+1);
        }
        if(res==false)
        res=hasString(matrix,mat,str,rows,cols,r,c+1,i+1);
        if(res==false)
        res=hasString(matrix,mat,str,rows,cols,r,c-1,i+1);
        return res;
        
    }

 

posted on 2020-05-29 17:47  troubleasy  阅读(122)  评论(0编辑  收藏  举报