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

    题目:

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

     思路:

    回溯法:找不到下一个目标时,就回退到上一个找到了的目标。

    1)先遍历这个矩阵,找到路径中的第一个字符a

    2)然后遍历第一个字符a上下左右的字符,找有无路径中的第二个字符。

      如果有和字符串str中下一个字符相同的,就把那个字符当作下一个字符(下一次遍历的起点)

      如果没有,就需要回退到上一个字符,然后重新遍历。

      为了避免路径重叠,需要一个辅助矩阵【boolmatrix】来记录路径情况。

    下面代码中,当矩阵坐标为(row,col)的格子和路径字符串中下标为pathLength的字符一样时,从4个相邻的格子(row,col-1)、(row-1,col)、(row,col+1)以及(row+1,col)中去定位路径字符串中下标为pathLength+1的字符。

    如果4个相邻的格子都没有匹配字符串中下标为pathLength+1的字符,表明当前路径字符串中下标为pathLength的字符在矩阵中的定位不正确,我们需要回到前一个字符串(pathLength-1),然后重新定位。

    一直重复这个过程,直到路径字符串上所有字符都在矩阵中找到格式的位置(此时str[pathLength] == ‘’)。

    class Solution:
        def hasPath(self, matrix, rows, cols, path):
            """
            :param matrix: 字符矩阵
            :param rows: 矩阵行数
            :param cols: 矩阵列数
            :param path: 需要寻找的路径
            :return:
            """
            if len(matrix) != rows * cols or len(matrix) == 0 or rows <= 0 or cols <= 0 or path is None:
                # 参数校验
                return False
            boolmatrix = [0] * (rows * cols)  # 这样乘出来是个矩阵了
            pathLength = [0]  # 已经找到的路径长度
            for y in range(rows):
                for x in range(cols):
                    if self.findPath(matrix, rows, cols, x, y, path, pathLength, boolmatrix):
                        return True
            return False
    
        def findPath(self, matrix, rows, cols, x, y, path, pathLength, boolmatrix):
            """
            :param x: 当前位置的横坐标(对应列数【!】)
            :param y:
            :param path:
            :param pathLength: 当前路径寻找到了的长度
            :param boolmatrix: 布尔矩阵数组,访问标志数组,字符在路径中:该位置标为true
            :return:
            """
            if pathLength[0] == len(path):
                # 当前路径长度已经等于字符串长度了,就是已经全部找完了
                return True
            nextPath = False
            # 参数校验:1、位置坐标不超过行列数
            # 2、当前位置字符等于路径中对应位置的字符
            # 3、当前位置未存在于当前已找到的路径中
            if 0 <= x < cols and 0 <= y < rows and 
                matrix[y * cols + x] == path[pathLength[0]] and 
                not boolmatrix[y * cols + x]:
                boolmatrix[y * cols + x] = True
                pathLength[0] += 1
                # 找周围的有没有下一个字符
                nextPath = self.findPath(matrix, rows, cols, x - 1, y, path, pathLength, boolmatrix) or 
                           self.findPath(matrix, rows, cols, x + 1, y, path, pathLength, boolmatrix) or 
                           self.findPath(matrix, rows, cols, x, y - 1, path, pathLength, boolmatrix) or 
                           self.findPath(matrix, rows, cols, x, y + 1, path, pathLength, boolmatrix)
                if not nextPath:
                    # 没找到该字符,回溯到上一个,布尔标记矩阵中对应的位置标为false
                    pathLength[0] -= 1
                    boolmatrix[y * cols + x] = False
            return nextPath

     遇到的问题:

    1、提示:string index out of range 

      原因:findPath中,x和y分别表示当前所找字符的横坐标、纵坐标,但是!横坐标代表的是列数,所以参数判断的时候,应该是x<cols,横坐标的值要小于列数

  • 相关阅读:
    Java实现 蓝桥杯VIP 算法提高 P0404
    Java实现 蓝桥杯VIP 算法提高 P0404
    Java实现 蓝桥杯VIP 算法提高 P0404
    Java实现 蓝桥杯VIP 算法提高 P0404
    Java实现 蓝桥杯VIP 算法提高 P0404
    Java实现 蓝桥杯VIP 算法训练 排列问题
    Java实现 蓝桥杯VIP 算法训练 排列问题
    Java实现 蓝桥杯VIP 算法训练 排列问题
    Java实现 蓝桥杯VIP 算法训练 排列问题
    关于模态/非模态对话框不响应菜单的UPDATE_COMMAND_UI消息(对对WM_INITMENUPOPUP消息的处理)
  • 原文地址:https://www.cnblogs.com/RebeccaG/p/12097562.html
Copyright © 2011-2022 走看看