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

    题目:

    请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如

    矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。

    代码:

     1 class Solution {
     2 public:
     3     bool hasPath(char* matrix, int rows, int cols, char* str) {
     4         if(str == NULL || rows <= 0 || cols <= 0 )
     5             return false;
     6         bool* finish = new bool[rows*cols]();
     7         for(int i = 0; i < rows; i ++)
     8             for(int j = 0; j < cols; j ++)
     9                 if(isHasPath(matrix,rows,cols,str,finish,i,j))
    10                     return true;
    11         return false;
    12     }
    13     bool isHasPath(char* matrix, int rows, int cols, char* str, bool* fin, int x, int y) {
    14         if(*str == '')
    15             return true;
    16         if(x < 0 || x >= rows || y < 0 || y >= cols)  
    17             return false;
    18         if(fin[x*cols + y] || *str != matrix[x*cols + y])
    19             return false;
    20         fin[x*cols + y] = true;
    21         bool sign = isHasPath(matrix, rows, cols, str+1, fin, x-1, y)
    22             ||isHasPath(matrix, rows, cols, str+1, fin, x+1, y)
    23             ||isHasPath(matrix, rows, cols, str+1, fin, x, y-1)
    24             ||isHasPath(matrix, rows, cols, str+1, fin, x, y+1);
    25         fin[x*cols + y] = false;
    26         return sign;
    27     }
    28 };

    我的笔记:

      这是一个可以用回朔法解决的典型题。首先,在矩阵中任选一个格子作为路径的起点。如果路径上的第i个字符不是ch,那么这个格子不可能处在路径上的
    第i个位置。如果路径上的第i个字符正好是ch,那么往相邻的格子寻找路径上的第i+1个字符。除在矩阵边界上的格子之外,其他格子都有4个相邻的格子。
    重复这个过程直到路径上的所有字符都在矩阵中找到相应的位置。
      由于回朔法的递归特性,路径可以被开成一个栈。当在矩阵中定位了路径中前n个字符的位置之后,在与第n个字符对应的格子的周围都没有找到第n+1个
    字符,这个时候只要在路径上回到第n-1个字符,重新定位第n个字符。
      由于路径不能重复进入矩阵的格子,还需要定义和字符矩阵大小一样的布尔值矩阵,用来标识路径是否已经进入每个格子。 当矩阵中坐标为(row,col)的
    格子和路径字符串中相应的字符一样时,从4个相邻的格子(row,col-1),(row-1,col),(row,col+1)以及(row+1,col)中去定位路径字符串中下一个字符
    如果4个相邻的格子都没有匹配字符串中下一个的字符,表明当前路径字符串中字符在矩阵中的定位不正确,我们需要回到前一个,然后重新定位。
      一直重复这个过程,直到路径字符串上所有字符都在矩阵中找到合适的位置
  • 相关阅读:
    loj#6433. 「PKUSC2018」最大前缀和(状压dp)
    PKUWC2019游记
    10. Regular Expression Matching
    9. Palindrome Number
    8. String to Integer (atoi)
    7. Reverse Integer
    6. ZigZag Conversion
    5. Longest Palindromic Substring
    4. Median of Two Sorted Arrays
    3. Longest Substring Without Repeating Characters
  • 原文地址:https://www.cnblogs.com/john1015/p/13140974.html
Copyright © 2011-2022 走看看