描述
请设计一个函数,用来判断在一个n乘m的矩阵中是否存在一条包含某长度为len的字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。数据范围:0 \le n,m \le 20\0≤n,m≤20 ,1\le len \le 25\1≤len≤25
方法一:深度搜索,递归
class Solution {
public:
bool hasPath(vector<vector<char> >& matrix, string word) {
if(matrix.size() == 0) return false;
int index = 0;
//遍历一般矩阵,把每个点放进去深度搜索
for(int i =0;i<matrix.size();i++){
for(int j=0;j<matrix[0].size();j++){
if(dfs(matrix,word,index,i,j)){
return true;
}
}
}
return false;
}
bool dfs(vector<vector<char>>& matrix, string word, int index,int i,int j){
if(i<0 || i>=matrix.size() || j<0 || j>=matrix[0].size() || matrix[i][j]!= word[index]){
return false;
}
if(index == word.size()-1){
return true;
}
//剪枝,把走过的点替换成 '.',防止重复搜索
char temp = matrix[i][j];
matrix[i][j]='.';
//深度搜索递归,四个方向都搜索一遍,实际只有三个方向
bool res = dfs(matrix,word,index+1,i+1,j)
|| dfs(matrix,word,index+1,i-1,j)
|| dfs(matrix,word,index+1,i,j+1)
|| dfs(matrix,word,index+1,i,j-1);
matrix[i][j] = temp; //还原该点
return res;
}
};