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