Python 回溯算法

回溯算法(试探法)

在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。

回溯算法解决问题的

  • 针对所给问题,定义问题的解空间,它至少包含问题的一个(最优)解。
  • 确定易于搜索的解空间结构,使得能用回溯法方便地搜索整个解空间 。
  • 以深度优先的方式搜索解空间,并且在搜索过程中用剪枝函数避免无效搜索。

实例:

地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,
每一次只能向左,右,上,下四个方向移动一格,
但是不能进入行坐标和列坐标的数位之和大于k的格子。
例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?

class Solution:
    def movingCount(self, threshold, rows, cols):
        "产生 0 矩阵 "
        board=[[0 for i in range(cols)] for j in range(rows)]
        global acc
        acc = 0
        "下标之和,若大于threshold则TRUE,否则Folse"
        def block(r,c):
            s=sum(map(int,str(r)+str(c)))
            return s>threshold

        def traverse(r,c):
            global acc
            if not (0<=r<rows and 0<=c<cols):   # 超出角标范围挑出
                return
            if board[r][c]!=0:    # 不等于0 跳出
                return
            if board[r][c]==-1 or block(r,c):
                board[r][c]=-1    #超出门限的点记录-1
                return

            board[r][c]=1 #符合规定的点记录1,并计数加一
            acc+=1
            traverse(r+1,c)
            traverse(r-1,c)
            traverse(r,c+1)
            traverse(r,c-1)

        traverse(0,0)
        return acc


o = Solution()
print(o.movingCount(4 ,3 ,3))

# 输出结果:
9
原文地址:https://www.cnblogs.com/spmt/p/10607027.html