剑指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;
}