zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    react ts axios 配置跨域
    npm run eject“Remove untracked files, stash or commit any changes, and try again.”错误
    java 进程的参数和list的线程安全
    帆软报表 大屏列表跑马灯效果JS
    帆软报表 快速复用数据集,避免重复劳动
    分析云 OA中部门分级思路和实现方法
    分析云 分段器 只显示一个块的数据
    分析云 更改服务默认的端口号
    分析云U8项目配置方法新版本(2)
    Oracle 创建时间维度表并更新是否工作日字段
  • 原文地址:https://www.cnblogs.com/spmt/p/10607027.html
Copyright © 2011-2022 走看看