剑指Offer-12 矩阵中的路径
重要的是理解查找的逻辑,每到一个新节点就分别向上下左右四个方向进行查找,不满足的返回false,满足的在没有达成条件时继续进行查找
#include <iostream> #include <vector> #include <string> using namespace std;
vector<vector<char> > vv; //用来辨识当前元素是否是此躺已经查找过的元素
bool dfs(vector<vector<char> > &v,string& str,int a,int b,int len){
if(len==str.length()){ //判断是否已满足条件(全部找到),找到则返回 return true; } if(a<0||a>=v.size()||b<0||b>=v[0].size()||vv[a][b]!=str[len]){
return false;
}
char tmp= vv[a][b];
vv[a][b]='-'; //标记当前字符
if(dfs(v,str,a,b+1,len+1)|| //分别向四个方向查找
dfs(v,str,a+1,b,len+1)||
dfs(v,str,a,b-1,len+1)||
dfs(v,str,a-1,b,len+1)){ //四个方向的查找只要有一条路查找成功则返回true(字符串存在)
return true;
}
vv[a][b]=tmp; //查询无果则将其变回原状
return false;
}
bool exist_string(vector<vector<char> > &v,string &s ){ for(int i=0;i<v.size();i++){ for(int j=0;j<v[0].size();j++){ if(v[i][j]==s[0]){ //当找到与字符串第一个字符相同的字符时开始查找 vv=v ; //初始化对比数组
if(dfs(v,s,i,j,0)) return true; } } } return false; }
//测试例 int main(){ string str="lkjfegq"; vector<vector<char> > v= {{'a','e','f','q'}, {'c','b','n','g'}, {'x','z','r','e'}, {'l','k','j','f'} }; if(exist_string(v,str)){ cout<<"true"<<endl; } else{ cout<<"false"<<endl; } return 0; }