DFS+回溯的模板,主要注意的就是溢出问题和回溯写在什么地方比较合适,再加上一个容器储存方向;
class Solution {
public:
bool DFS(vector<vector<char>>& matrix, string &str) {
//最简单的DFS,也就对影成模板
if(matrix.size()==0) return 0;
//在这个点上,就是你要选的到0,你得保证0存在;
int row=matrix.size(),col = matrix[0].size();
vector<vector<bool>> isUsed(row,vector<bool>(col,0));
//将方向都存在vec里;
vector<pair<int,int>> mode={{-1,0},{1,0},{0,1},{0,-1}};
bool res=0;
function<void(int,int,int)>dfs=[&](int x,int y,int pos){
if(x<0||x>=row||y<0||y>=col||isUsed[x][y]==1||matrix[x][y]!=str[pos]) return ;
if(pos==str.size()-1){
res=1;
return ;
}
//这里是回溯的点,能进来就置1;
isUsed[x][y]=1;
for(int i=0;i<mode.size()&&!res;i++){
auto [dx,dy]=mode[i];
dfs(x+dx,y+dy,pos+1);
// isUsed[x+a][y+b]=0;
}
//这个点结束了,置0;
isUsed[x][y]=0;
return ;
};
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
dfs(i,j,0);
if(res) break;
}
}
return res;
}
};