美文网首页
回溯法——矩阵中的路径

回溯法——矩阵中的路径

作者: 二十岁的弹簧 | 来源:发表于2018-12-12 12:55 被阅读0次

回溯法
回溯法可以看成蛮力法的升级版,它从解决问题每一步的所有可能选项里系统地选择出一个可行的解决方案。回溯法非常适合由多个步骤组成的问题,并且每个步骤都有多个选项。

用回溯法解决的问题的所有选项可以形象地用树状结构来表示。

题目:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3X4的矩阵中包含一条字符串‘bfce’的路径,但是矩阵中不包含字符串‘abfb’的路径。

a b t g
c f c s
j d e h
class Solution:
    def find_str(self, target, matrix, rows, columns):
        if target is None or matrix is None or rows <= 0 or columns <= 0:
            raise Exception('Nothing')
        current_char = 0
        for r in range(rows):
            for c in range(columns):
                if self.has_path(target, matrix, rows, columns, r, c, current_char):
                    return True
        return False
    
    def has_path(self, _str, matrix, rows, cols, r, c, current_char, used_label=None):
        if current_char == len(_str):
            return True
        if not used_label:
            used_label = {(row, col): 0 for row in range(rows) for col in range(cols)}
        ret = False
        
        if r >=0 and c >=0 and r < rows and c < cols and not used_label[(r, c)] and matrix[r][c] == _str[current_char]:
            current_char += 1
            used_label[(r, c)] = 1
            ret = self.has_path(_str, matrix, rows, cols, r+1, c, current_char, used_label) or  \
                      self.has_path(_str, matrix, rows, cols, r-1, c, current_char, used_label) or \
                      self.has_path(_str, matrix, rows, cols, r, c+1, current_char, used_label) or \
                      self.has_path(_str, matrix, rows, cols, r, c-1, current_char, used_label)
            if not ret:
                current_char -= 1
                used_label[(r, c)] = 0
        return ret
        '''
        if matrix[r][c] != _str[current_char]:
            return False
        
        if used_label[(r, c)] == 1:
            return False
        
        current_char += 1
        if current_char == len(_str):
            return True
        used_label[(r, c)] = 1
        
        action = [(0, 1), (0, -1), (1, 0), (-1, 0)]
        
        for r_change, c_change in action:
            r = r + r_change
            c = c + c_change
            if r < 0 or c < 0 or r == rows or c == cols:
                continue
            if not self.has_path(_str, matrix, rows, cols, r, c, current_char, used_label):
                continue
        return True
        '''

相关文章

  • 回溯法——矩阵中的路径

    回溯法回溯法可以看成蛮力法的升级版,它从解决问题每一步的所有可能选项里系统地选择出一个可行的解决方案。回溯法非常适...

  • 剑指Offer(二)

    题目汇总11.旋转数组的最小数字(简单),本题考查查找和排序12.矩阵中的路径—回溯问题(中等),本题考查回溯法1...

  • 12-矩阵中的路径-回溯

    请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步...

  • [JS]回溯算法之矩阵中的路径

    题目:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,...

  • 《剑指Offer》回溯 矩阵中的路径

    题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格...

  • 算法笔记_09 哈密顿环(NP、回溯法、分支定界)

    引用 哈密顿回路分支限界遍历法 哈密顿回路-回溯法 汉密尔顿路径(哈密顿路径)解析 基于回溯法寻找哈密顿回路 哈密...

  • 2020-12-27

    对于回溯法求解问题,在递归过程,往往使用传引用去获得目标路径或结果。同时在回溯过程,若无法得到正确路径,则需要清除...

  • 《剑指Offer》回溯法

    回溯法 通常物体或人在二维方格运动这类问题都可以用回溯法解决,一般把矩阵看成二维数组。 面试题 题目描述:请设计一...

  • 深搜 排列组合

    1.DFS 2.回溯 回溯法是剪枝的暴力法。 剪枝函数包括两类:1.使用约束函数,剪去不满足约束条件的路径;2.使...

  • 矩阵中的路径

    请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每...

网友评论

      本文标题:回溯法——矩阵中的路径

      本文链接:https://www.haomeiwen.com/subject/kdbuhqtx.html