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

 

posted @ 2020-11-13 10:55  Kaniso_Vok  阅读(60)  评论(0编辑  收藏  举报