【大爽python算法】递归算法进化之回溯算法(backtracking)

四皇后问题【Python解法】【回溯算法】 经典四皇后问题(八皇后问题)Python解法。 使用DFS+剪枝+回溯。 容易理解的剪枝方法,快速简洁实现四皇后问题。 阅读详情

作者自我介绍:大爽歌, b站小UP主 ,
python1对1辅导老师,
时常直播编程,直播时免费回答简单问题。

前置知识: 递归算法(recursion algorithm)。
我的递归教程: 【教程】python递归三部曲(基于turtle实现可视化)
回溯与递归的关系:
回溯是一种算法思想,递归是实现方式。

回溯法经典问题:
八皇后问题、数独问题。

(其实两个很像)

八皇后问题

八皇后问题是一个以国际象棋为背景的问题:

如何在8×8的国际象棋棋盘上放置八个皇后,使其不互相攻击。
即任两个皇后都不能处于同一条横行、纵行或斜线上。

n皇后问题

八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n×n,而皇后个数也变成n。

(当且仅当n = 1 或 n ≥ 4时问题有解)

4皇后问题!

八皇后讨论起来比较麻烦,先讨论四皇后情况(n=4)

首先展示下错误的情况:

如上图所示,三个图的错误分别是

  1. 第一行有重复了
  2. 对角线有重复了。(注意有两个对角线)
  3. 第一列有重复

想要正确,则每一行每一列,每个对角线(对角线有两个方向)都不能有重复项。

正确的情况示例如下:

回溯法

回溯法(backtracking)是暴力搜索法中的一种。

其核心思想就是不断尝试,不行就后退再试其他的。

关于这一思想,我之前有个视频,感觉能比较形象地展示,感兴趣可以看看:

迷宫探索动画

接下来我们用回溯法探究下刚才的4皇后问题。

回溯法过程展示

个人感觉用行列坐标表示不够直观,所以给每个格子从前往后依次编号。
后面用编号来称呼位置(无特殊说明的话)
如下图

同时四个皇后从前往后按次序编为
Q 1 Q_1 Q1​、 Q 2 Q_2 Q2​、 Q 3 Q_3 Q3​、 Q 4 Q_4 Q4​

原始的回溯法
每次会从前往后依次尝试每个编号的位置。

为了简化谈论,以下先进行了一定的优化。

由于每行不能重复,n个皇后必须分别放在n行上。
当有一行放不下了时。也就失败了。

所以
Q 1 Q_1 Q1​必须放在第一行(行索引为0)
Q 2 Q_2 Q2​必须放在第二行(行索引为1)
Q 3 Q_3 Q3​必须放在第三行(行索引为2)
Q 4 Q_4 Q4​必须放在第四行(行索引为3)

1 Q 1 Q_1 Q1​放位置0

使用回溯法, Q 2 Q_2 Q2​仍然会从0开始尝试,发现放不了,就往后走。

由于 Q 1 Q_1 Q1​放位置0。所以
0、1、2、3、
4、8、12、
5、10、15都放不了

Q 2 Q_2 Q2​从第二行开头试。
即从4、5开始试,一直试到6才能够放下,那么就先放在这里。

Q 2 Q_2 Q2​放位置6

那么接下来继续尝试 Q 3 Q_3 Q3​,
会发现第三行(行索引为2)已经放不了了。
如下图

这说明

Q 2 Q_2 Q2​放位置6失败

回来重新放 Q 2 Q_2 Q2​,放位置7

Q 2 Q_2 Q2​放位置7

此时 Q 3 Q_3 Q3​唯一能放的位置只有9。
之后, Q 4 Q_4 Q4​已经无处可放。

如下图

这说明

Q 2 Q_2 Q2​放位置7失败

Q 2 Q_2 Q2​无位置可放

Q 2 Q_2 Q2​无位置可放,
说明 Q 1 Q_1 Q1​放在位置0失败。
Q 1 Q_1 Q1​需要尝试其他位置,即尝试先放在位置1。

到这里回溯法的特点其实就已经展现的比较够了:
即不断向下尝试,如果所有尝试都失败,那就后退一步,重新尝试。

2 Q 1 Q_1 Q1​放位置1

此时 Q 2 Q_2 Q2​只能放在位置7,
之后 Q 3 Q_3 Q3​只能放在位置8,
最后 Q 3 Q_3 Q3​只能放在位置14,

即如下图所示

到这里,如果只要求找到一个解法,问题就已经结束了,如果要找到所有解法,那就是继续往后不断尝试。

代码实现

原始回溯法代码
class NQueens:
    def __init__(self, n):
        self.n = n
        # 保存每个皇后的坐标, (ci, ri)
        # 第一行第一列的皇后坐标为(0, 0)
        self.one_solution = []

    def check_can_place(self, ri, ci):
        for pos in self.one_solution:
            pc, pr = pos
            if pc == ci:  # 行检测
                return False

            if pr == ri:  # 列检测
                return False

            if pr - pc == ri - ci:  # 对角线检测 1
                return False

            if pr + pc == ri + ci:  # 对角线检测 2
                return False

        return True

    def solve(self):
        for ri in range(self.n):
            for ci in range(self.n):
                if self.check_can_place(ri, ci):
                    pos = (ci, ri)
                    self.one_solution.append(pos)

                    if len(self.one_solution) == self.n:
                        return True

                    res = self.solve()
                    if res:
                        return True
                    else:
                        self.one_solution.pop()

        return False

    def show_in_board(self):
        board = [
            ["-" for i in range(self.n)] for j in range(self.n)
        ]
        for pos in self.one_solution:
            pc, pr = pos
            board[pr][pc] = "Q"

        for row in board:
            print(" ".join(row))


nq = NQueens(8)
res = nq.solve()
if res:
    print("Queens positions:")
    print(nq.one_solution)
    print("Queens in board:")
    nq.show_in_board()

输出结果

Queens positions:
[(0, 0), (4, 1), (7, 2), (5, 3), (2, 4), (6, 5), (1, 6), (3, 7)]
Queens in board:
Q - - - - - - -
- - - - Q - - -
- - - - - - - Q
- - - - - Q - -
- - Q - - - - -
- - - - - - Q -
- Q - - - - - -
- - - Q - - - -
check_can_place方法

该方法,用于检查指定的横纵坐标,是否还能防止皇后(不与已经放置的皇后冲突)

检查是否能放置
行和列好分析,对角线情况则比较麻烦。
两种对角线图示如下

第一种对角线(红色对角线)
每一条对角线上格子, r − c r-c r−c都是相同的值。
可以通过这个值来判断是否在同一条对角线上。

第二种对角线(绿色对角线)
每一条对角线上格子, r + c r+c r+c都是相同的值。
可以通过这个值来判断是否在同一条对角线上。

solve方法解析
def solve(self):
    for ri in range(self.n):
        for ci in range(self.n):
            # 从前往后尝试所有的位置,看是否能放皇后
            if self.check_can_place(ri, ci):
                # 成功则添加
                pos = (ci, ri)
                self.one_solution.append(pos)

                if len(self.one_solution) == self.n:
                    # 皇后数量已到达n,问题解决,返回解决成功
                    return True

                # 走到这里,说明还没解决

                # 递归调用自身,看当前情况往后是否能够解决成功
                res = self.solve()
                if res:
                    # 成功,就继续返回解决成功
                    return True
                else:
                    # 失败,之前添加的pos方法,是不成功的,将其弹出,之后继续尝试
                    self.one_solution.pop()

    return False

代码优化与拓展

优化:一行一试

上面的原始回溯法的代码。
每一次放皇后都是从前往后一个一个试,效率很低。

这里按照上文讨论中的思路进行优化,
即每一行放一个皇后。

那么代码里面就是每一行,从第一列开始一直尝试到最后一列。
一行放好后,就往下一行进行尝试。

这里只需要给NQueens类添加一个新方法solve_advanced即可

def solve_advanced(self, ri=0):
    for ci in range(self.n):
        if self.check_can_place(ri, ci):
            pos = (ci, ri)
            self.one_solution.append(pos)

            if ri == self.n - 1:
                return True

            res = self.solve_advanced(ri+1)
            if res:
                return True
            else:
                self.one_solution.pop()

    return False

调用时的res = nq.solve()改成res = nq.solve_advanced()即可。

输出和原始回溯法时的输出是一样的。
不过代码运行的速度会得到很大提升。

不仅如此,优化后的代码在去求所有解时,不会求出重复情况。

拓展:获得所有解(不重复)

求所有解的代码在优化后的方法上,简单调整以下就好

  • 不再返回(即不会试到一个成功的就退出)
  • 成功后将结果记录,记录时要使用切片进行拷贝。

首先,先在NQueens的__init__方法中添加新的属性,用于记录解决方法。

self.solutions = []

然后给NQueens类添加新方法solve_all

def solve_all(self, ri=0):
    for ci in range(self.n):
        if self.check_can_place(ri, ci):
            pos = (ci, ri)
            self.one_solution.append(pos)

            if ri == self.n - 1:
                self.solutions.append(self.one_solution[:])
            else:
                self.solve_all(ri+1)

            self.one_solution.pop()

然后修改下show_in_board方法。
因为原来的方法只能展示self.one_solution。
这里希望也能够展示别的solution

修改后的show_in_board如下

def show_in_board(self, sol=None):
    board = [
        ["-" for i in range(self.n)] for j in range(self.n)
    ]
    if sol is None:
        sol = self.one_solution

    for pos in sol:
        pc, pr = pos
        board[pr][pc] = "Q"

    for row in board:
        print(" ".join(row))
总代码

一个NQueens的实例,只能调用三个方法中的一个(一次)

  • solve
  • solve_advanced
  • solve_all

重复调用可能会出问题(需要再调用,建议新建NQueens实例)

以下总代码中只展示solve_all的调用结果。
且由于八皇后问题的解太多(有92个),
以下只展示下六皇后问题的调用求解

class NQueens:
    def __init__(self, n):
        self.n = n
        # 保存每个皇后的坐标, (ci, ri)
        # 第一行第一列的皇后坐标为(0, 0)
        self.one_solution = []

        self.solutions = [

        ]

    def check_can_place(self, ri, ci):
        for pos in self.one_solution:
            pc, pr = pos
            if pc == ci:  # 行检测
                return False

            if pr == ri:  # 列检测
                return False

            if pr - pc == ri - ci:  # 对角线检测 1
                return False

            if pr + pc == ri + ci:  # 对角线检测 2
                return False

        return True

    def solve(self):
        for ri in range(self.n):
            for ci in range(self.n):
                if self.check_can_place(ri, ci):
                    pos = (ci, ri)
                    self.one_solution.append(pos)

                    if len(self.one_solution) == self.n:
                        return True

                    res = self.solve()
                    if res:
                        return True
                    else:
                        self.one_solution.pop()

        return False

    def solve_advanced(self, ri=0):
        for ci in range(self.n):
            if self.check_can_place(ri, ci):
                pos = (ci, ri)
                self.one_solution.append(pos)

                if ri == self.n - 1:
                    return True

                res = self.solve_advanced(ri+1)
                if res:
                    return True
                else:
                    self.one_solution.pop()

        return False

    def solve_all(self, ri=0):
        for ci in range(self.n):
            if self.check_can_place(ri, ci):
                pos = (ci, ri)
                self.one_solution.append(pos)

                if ri == self.n - 1:
                    self.solutions.append(self.one_solution[:])
                else:
                    self.solve_all(ri+1)

                self.one_solution.pop()

    def show_in_board(self, sol=None):
        board = [
            ["-" for i in range(self.n)] for j in range(self.n)
        ]
        if sol is None:
            sol = self.one_solution

        for pos in sol:
            pc, pr = pos
            board[pr][pc] = "Q"

        for row in board:
            print(" ".join(row))


nq = NQueens(6)

nq.solve_all()
for si in range(len(nq.solutions)):
    sol = nq.solutions[si]
    print("=== Solution %s ===" % si)
    print("Queens positions:")
    print(sol)
    print("Queens in board:")
    nq.show_in_board(sol)
输出

总代码的输出如下

=== Solution 0 ===
Queens positions:
[(1, 0), (3, 1), (5, 2), (0, 3), (2, 4), (4, 5)]
Queens in board:
- Q - - - -
- - - Q - -
- - - - - Q
Q - - - - -
- - Q - - -
- - - - Q -
=== Solution 1 ===
Queens positions:
[(2, 0), (5, 1), (1, 2), (4, 3), (0, 4), (3, 5)]
Queens in board:
- - Q - - -
- - - - - Q
- Q - - - -
- - - - Q -
Q - - - - -
- - - Q - -
=== Solution 2 ===
Queens positions:
[(3, 0), (0, 1), (4, 2), (1, 3), (5, 4), (2, 5)]
Queens in board:
- - - Q - -
Q - - - - -
- - - - Q -
- Q - - - -
- - - - - Q
- - Q - - -
=== Solution 3 ===
Queens positions:
[(4, 0), (2, 1), (0, 2), (5, 3), (3, 4), (1, 5)]
Queens in board:
- - - - Q -
- - Q - - -
Q - - - - -
- - - - - Q
- - - Q - -
- Q - - - -

参考文档

Python高级算法——回溯法(Backtracking) 回溯法是一种通过尝试所有可能的解来找到问题解的算法设计方法。它通常通过递归实现,每一步选择一个可能的解,如果解不符合要求,则进行回退,尝试其他可能的解,直到找到满足问题条件的解。回溯法是一种通过尝试所有可能的解来找到问题解的算法设计方法,适用于组合问题、排列问题、子集问题等。在Python中,我们可以应用回溯法解决各种问题,如八皇后问题、子集问题等。理解回溯法的基本概念和算法思想,对于解决需要穷尽所有可能解的问题具有重要意义,能够提高算法的效率。 阅读详情

相关推荐

RK3588网络调试笔记:当我把默认RTL8211F PHY换成另一款时,踩了哪些坑?

本文详细记录了在RK3588平台上将默认RTL8211F PHY芯片替换为其他型号的全过程,包括硬件设计验证、内核驱动适配、复位时序配置等关键步骤。通过实际案例分享,提供了从驱动调试到硬件优化的系统性解决方案,帮助开发者高效完成PHY芯片替换,确保网络接口稳定性。

weixin_30291791的博客 669

遗传算法实战:N皇后问题的Python工程化实现与调优

遗传算法是一种模拟自然选择与进化的全局优化方法,适用于解空间巨大、不可导、强约束但可评估的组合优化问题。其核心在于种群编码、适应度函数设计、选择-变异-演化机制及收敛控制。在N皇后这类典型离散约束问题中,算法价值体现在避免穷举、支持并行搜索、无需梯度信息,并能通过合理编码(如一维排列)和鲁棒适应度设计(如1000/(1+q))保障可行性与进化压力。本文聚焦Python工程实践,覆盖种群初始化策略、变异替代交叉的合理性、实时收敛监控、浮点安全终止、可视化调试等关键环节,为调度、排程、布局等工业场景提供可复用的

weixin_34161083的博客 388

基于Agent与大模型的性能测试脚本自动化生成实践

性能测试是软件质量保障的关键环节,其核心在于模拟真实用户负载以评估系统在高并发下的表现。传统脚本编写依赖人工,效率低下且易出错。通过引入智能体(Agent)与大语言模型(LLM)技术,可实现从自然语言描述或接口文档到可执行脚本的自动化转换。Agent负责任务规划与工具调用,LLM则提供强大的意图理解与代码生成能力,二者结合能精准解析测试场景、自动处理参数化与接口关联等复杂逻辑。该技术方案显著提升了脚本生成效率与准确性,尤其适用于持续集成、海量接口回归等需要快速构建测试场景的工程实践。本文以JMeter和Lo

weixin_28718769的博客 259

python 回溯算法总结

python 回溯算法回溯算法理论基础组合组合总数III电话号码的字母组合组合总和组合总和ii分割回文串 回溯算法理论基础 回溯算法解决的问题都可以抽象为树形结构(N叉树),用树形结构来理解回溯会容易很多。 回溯法一般可以解决如下几种问题: 组合问题:N个数里面按一定规则找出K个数的集合 切割问题:一个字符串按一定的规则有几种切割方式 子集问题:一个N个数的集合里有多少符合条件的子集 排列问题:N个数按一定规则全排列,有几种排列方式 棋盘问题:N皇后,解数独等 回溯算法模板: 回溯算法的返回值和参

weixin_45548695的博客 5278

AI大模型学习(13)小白也能学会的10分钟豆包大模型的python教程1

豆包AI大模型API是字节跳动推出的智能对话接口服务,开发者可以通过简单的HTTP请求调用强大的AI能力,实现智能问答、内容生成等功能。

isoft888的专栏,致力于C#/python分享物联网、大数据,神经网络的等领域,欢迎讨论交流! 1001

深入理解Linux 内核追踪机制

Linux 存在众多 tracing tools,比如 ftrace、perf,他们可用于内核的调试、提高内核的可观测性。众多的工具也意味着繁杂的概念,诸如 tracepoint、trace events、kprobe、eBPF 等,甚至让人搞不清楚他们到底是干什么的。本文尝试理清这些概念。

youzhangjing_的博客 1730

python实现回溯算法

回溯算法是一种经典的解决组合优化问题、搜索问题以及求解决策问题的算法。它通过不断地尝试各种可能的候选解,并在尝试过程中搜索问题的解空间,直到找到问题的解或者确定问题无解为止。回溯算法常用于解决诸如排列、组合、子集、棋盘类等问题。if 满足结束条件: # 如果已经满足结束条件result.append(path[:]) # 将当前路径添加到结果中returnfor 选择 in 候选集: # 遍历所有候选选择if 当前选择合法: # 如果当前选择是合法的做出选择 # 将当前选择添加到路径中。

liulanba的博客 3332

20251121更新纷玩岛

【代码】20251121更新纷玩岛。

猫敷雪 1019

【编程之路】面试必刷TOP101:递归 / 回溯(55-61,Python实现)

面试必刷TOP101:递归 / 回溯(55-61,Python实现)

Data · Model · Agent · Repeat 814

GEE案例教程:融合Sentinel-1 SAR数据、Sentinel-2光学影像和WorldPop人口数据,构建完整的洪水监测与影响评估工作流

本文介绍了一个专为巴基斯坦哈扎拉分区设计的洪水监测系统,该系统整合了Sentinel-1 SAR数据、Sentinel-2光学影像和WorldPop人口数据等多源遥感数据。系统通过VV极化SAR数据的水体提取算法(阈值-13dB)实现洪水范围监测,结合10米分辨率的光学影像进行可视化验证,并利用100米分辨率人口数据评估受灾人口。系统提供完整的技术实现,包括研究区加载、遥感数据处理、日期选择界面和洪水变化检测等功能模块,为灾害应急响应提供科学依据。

此星光明博客 191

半车(前后、左右)、整车悬架详细推导建模和simulink仿真分析

用达朗贝尔定理依据悬架数学模型,得到悬架模型微分方程,分别用simulink建立前后半车、左右半车悬架;结合转向2自由度模型与半车侧倾模型,对模型考虑相干性、延时性的C级随机路面下,仿真分析给定角阶跃输入下的侧倾稳定性。

Mr.邹的博客 1万+

算法宇宙中的材料革命:当Python遇见原子世界

在代码与晶格的交汇处,一场静默的革命正在发生。我们不再仅仅通过试管和显微镜观察材料,而是通过算法和神经网络理解物质的本质。Python算法库中的每一个模块,都是这场变革的微小齿轮,共同驱动着从经验直觉到数据智能的范式转变。 ## 从概率分布到材料命运:高斯函数的双重隐喻 [![高斯分布热力图](https://raw.gitcode.com/GitHub_Trending/pyt/Python

gitblog_00240的博客 883

【异常】Python环境中没有安装 `openpyxl` 模块提示ModuleNotFoundError: No module named ‘openpyxl‘

是一个用于读写Excel 2010 xlsx/xlsm/xltx/xltm文件的库。只是示例版本号,你可以根据需要选择不同的版本。安装完成后,再次尝试运行你的程序,应该就不会再出现。,这表明你的Python环境中缺少。运行一个Python程序时遇到了。如果由于某些原因你无法直接使用。,你可以指定版本号来安装,这里。要解决这个问题,你需要安装。

奶爸的编程之路,也就一周冷个三天 3398

哈密顿回路算法全解析:从NP完全问题到工程实践

图论中的哈密顿回路问题,是计算机科学中NP完全问题的经典代表,其核心在于寻找一条访问图中每个顶点恰好一次并返回起点的路径。该问题的计算复杂性极高,不存在已知的多项式时间精确算法,这使其成为算法设计与分析中的关键挑战。其技术价值在于,它是许多实际优化问题的抽象基础,例如旅行商问题(TSP)、物流路径规划和电路板钻孔。在实际应用中,面对不同规模的问题,需要灵活选用精确算法(如回溯法、动态规划)或启发式算法(如局部搜索、元启发式)。本文深入探讨了哈密顿回路的求解策略,涵盖了回溯法的剪枝优化、动态规划的状态压缩,以

weixin_34214500的博客 419

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

如何把实时摄像头变成吉卜力风格:Vision-Agents × Decart 完整实战教程(附虚拟试穿玩法)

想让摄像头里的自己实时变成动画风、还能边聊边换风格?Vision-Agents 的 Decart 插件就是干这个的:它把实时摄像头视频流用生成式 AI 做实时视频风格化,通话中随时切换风格。从安装到虚拟试穿,这篇带你全部走通。 [![Vision-Agents 接入 Decart 插件实时视频风格化效果演示](https://raw.gitcode.com/GitHub_Trending/vi/

gitblog_00650的博客 114

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Evolver信号去重完全指南:防止Agent陷入修复死循环的关键机制

**Evolver** 是 EvoMap 推出的 GEP 驱动 AI Agent 自进化引擎,它把 Agent 经验编码为基因(Gene)与胶囊(Capsule)来驱动可审计的进化。而让进化引擎"不翻车"的核心,正是本文主角——**Evolver 信号去重机制**:它通过历史频率抑制、修复循环检测与强制创新三套规则,从根源上防止 Agent 陷入"修不好→再修→再失败"的死循环。 ## 为什么

gitblog_01087的博客 527

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

《Hello 算法》动态规划问题特征深度解析:识别最优子结构与无后效性

动态规划并非“套公式就能解”的模板算法,能否适用取决于问题本身是否具备两项关键特征——**最优子结构(Optimal Substructure)** 与 **无后效性(No Aftereffects)**。本篇基于《Hello 算法》[动态规划问题特征](https://link.gitcode.com/i/4701b4799c62a9a03071ec4eca41fd4d)一章展开,结合仓库中十余

gitblog_00039的博客 371

Claude Mythos:重新定义AI工程能力边界的系统级模型

大语言模型正从通用文本生成走向深度系统理解与工程闭环执行。其核心演进已超越参数规模,转向符号推理、系统级内存建模与跨API语义理解的融合;强化学习不再聚焦对话拟人化,而是驱动长程目标规划与对抗性环境下的元级自我纠错;推理时计算(Test-Time Compute)则使模型能力随算力投入动态扩展。这种‘知识+策略+调度’三位一体的能力范式,正重塑软件开发、安全攻防与基础设施运维的技术实践。Claude Mythos作为典型代表,已在SWE-bench Pro和AISI 32步攻击模拟中展现出对真实代码库与复杂

weixin_30650039的博客 394

回溯算法详解(python)

回溯算法详解(python) 从本质上来说,回溯算法就是深度优先搜索(DFS)。而且,回溯算法和动态规划也很像,它们都是“分而治之”的思想,但是动态规划具有重叠子问题的特性,可以通过 dp table 优化,将递归树大幅剪枝。而那些无法大幅剪枝,只能暴力求解的动态规划就是回溯算法了。 对于回溯算法来说,最重要的是“路径”和“选择”,路径就是已经做出来的选择的集合。当回溯算法进行到最后时,如果其满足约束条件,那就把它加入解集,否则,回溯(这也是回溯算法的由来)。 对于回溯算法来说,一般是如下模式: resul

qq_45139385的博客 1万+

回溯法经典例题——python

1。七段码 2.年串字号 3.正整数分解 4.回路计数 5.N皇后问题

qq_49425744的博客 1211

递归回溯法经典——组合(python)

关于递归,虽然每次看代码都能明白别人代码的大体意思,但实际上当自己动手写的时候,往往没有头绪。为了解决这个问题,我感觉我们需要深入探究模拟别人代码的全过程,了解递归回溯的基本像树一样的全过程,才能帮助我们更好的理解,当然写这篇文章也是给自己一个记录复习,更能无法实质性的帮助到大家哈哈哈哈把组合问题抽象为如下树形结构这里我直接贴出卡尔老师的代码,因为代码的浅理解也比较容易建议大家结合着画着二叉树来模拟当n=4和k=2时,程序的完整具体运行过程如下:初始化res为空列表,初始化path为空列表。

maobuyiyyds的博客 1714

算法之【回溯算法】详解(python)

回溯算法 定义 回溯算法实际上**基于DFS(深度优先搜索)**的一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回到上一个状态,尝试其他的路径,这种走不通就退回再走的技术为回溯法;满足回溯条件的某个状态的点称为“回溯点”。 回溯相关问题 DFS 和回溯算法区别 DFS 是一个劲的往某一个方向搜索,直到到达最底层,而回溯算法建立在 DFS 基础之上的,但不同的是在搜索过程中,达到结束条件后,恢复状态,回溯上一层,再次搜索。因此回溯算法与 DFS 的

阿旭的博客 3911

回溯算法python

什么是回溯?简单来讲,回溯采用试错的方法解决问题,一旦发现当前步骤失败,回溯方法就返回上一个步骤,选择另一种方案继续试错。 回溯算法针对的大多数问题有以下特点:问题的答案有多个元素(可想象成走迷宫是有多个决定)、答案需要一些约束(比如数独)、寻找答案的方式在每一个步骤相同。回溯算法逐步构建答案,并在确定候选元素不满足约束后立刻放弃候选元素(一旦碰墙就返回),直到找到答案的所有元素。 文章目录一、查...

谢谢ο(=•ω<=)ρ⌒☆ 2854

回溯算法--python

本文主要讲述了回溯算法,讨论了几种常见的场景全排列问题、子集和问题和N皇后问题~

egglikeFe的博客 1835

【python算法基础】回溯算法

【python算法基础】回溯算法

⛄ 1421

字节编程题 雀魂启动

小包最近迷上了一款叫做雀魂的麻将游戏,但是这个游戏规则太复杂,小包玩了几个月了还是输多赢少。 于是生气的小包根据游戏简化了一下规则发明了一种新的麻将,只留下一种花色,并且去除了一些特殊和牌方式(例如七对子等),具体的规则如下: 总共有36张牌,每张牌是1~9。每个数字4张牌。 你手里有其中的14张牌,如果这14张牌满足如下条件,即算作和牌 14张牌中有2张相同数字的牌,称为雀头。 除去上述2张牌,剩下12张牌可以组成4个顺子或刻子。顺子的意思是递增的连续3个数字牌(例如234,567等),刻子的意思是相同.

尚未佩妥剑 转眼便江湖 581
上一篇: 联机游戏玩家卡顿概率分析
下一篇: 大爽pyqt5笔记&教程 一 基础窗口与控件 按钮点击
大爽歌
博客等级 码龄9年 422粉丝 92原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值