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 };
  • 相关阅读:
    Asp.net使用DevExpress的某些控件不能操作ViewState的解决方案
    关于 vue 循环组件,组件内有根据要求请求select下拉列表,组件内还有自身组件,select下拉列表无法正确获取的问题解决
    Vue+axios请求本地json
    关于vuevideoplayer 实现跳转到特定位置并自动播放
    VueQuillEditor回显不显示空格的处理办法
    elementui 的CascaderPanel级联面板类型 懒加载 回显
    elementui 中的文本域的autosize的意思
    解决 [Element Warn][Form]model is required for validate to work!
    初涉simulink
    arm学习计划
  • 原文地址:https://www.cnblogs.com/wmx24/p/8968284.html
Copyright © 2011-2022 走看看