zoukankan      html  css  js  c++  java
  • 剑指offer-矩阵中的路径

    题目描述

     
    请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如
    a b c e
    s f c s
    a d e e
    矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。
     

    解题思路

    本题可用回溯法来求解。定义一个访问数组初始全部置为0,并定义当前路径长度初始置0,从矩阵第一个字符开始遍历:

    • 从当前字符出发,若与字符串对应路径长度的字符相等,就分别向上下左右走一步,并把当前字符访问数组置1,路径长度加1;
    • 若当前字符走到了字符串末尾,说明存在一条路径与字符串相等,返回true;
    • 若当前字符出发的各条路径都不能找到一条路径与字符串相等,则向当前路径上一步回溯,并把当前字符访问数组置0,路径长度减1

    代码

     1 class Solution {
     2 public:
     3     bool hasPath(char* matrix, int rows, int cols, char* str)
     4     {
     5         if(!matrix||!str||rows<1||cols<1)
     6             return false;
     7         bool *visit=new bool[rows*cols];
     8         memset(visit,0,rows*cols);
     9         int pathLen=0;
    10         for(int row=0;row<rows;row++){
    11             for(int col=0;col<cols;col++){
    12                 if(hasPathCore(matrix,rows,cols,row,col,str,pathLen,visit))
    13                     return true;
    14             }
    15         }
    16         return false;
    17     }
    18     bool hasPathCore(const char* matrix, int rows, int cols, int row, 
    19                      int col, const char* str, int& pathLen, bool* visit){
    20         if(str[pathLen]=='')
    21             return true;
    22         bool hasPath=false;
    23         if(row<rows&&row>=0&&col<cols&&col>=0&&!visit[row*cols+col]&&
    24            str[pathLen]==matrix[row*cols+col]){
    25             visit[row*cols+col]=true;
    26             pathLen++;
    27             hasPath=hasPathCore(matrix,rows,cols,row+1,col,str,pathLen,visit)||
    28                 hasPathCore(matrix,rows,cols,row,col+1,str,pathLen,visit)||
    29                 hasPathCore(matrix,rows,cols,row-1,col,str,pathLen,visit)||
    30                 hasPathCore(matrix,rows,cols,row,col-1,str,pathLen,visit);
    31             if(!hasPath){
    32                 visit[row*cols+col]=false;
    33                 pathLen--;
    34             }
    35         }
    36         return hasPath;
    37     }
    38 
    39 };
  • 相关阅读:
    构造函数语义学之Default Constructor构建操作
    c++子类继承父类的覆盖问题
    C++中自己理解的一些细节哈
    学习C++所需看的书和顺序
    C++中强制变换之const_cast
    jquery锚点跳转
    关于iPhone X 适配
    input图片上传并显示查看判断图片类型
    jquery操作按钮修改对应input属性
    织梦dedecms会员中心分类管理无法修改、删除分类名
  • 原文地址:https://www.cnblogs.com/wmx24/p/8968284.html
Copyright © 2011-2022 走看看