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