回溯知识汇总

我对回溯的定义是不定层循环,此定义并不规范,但容易理解。回溯基本上用深度优先搜索实现,暂未发现反例。而深度优先搜索绝大部分是用递归实现。

输出两位以内的数

注意:1位数,也要输出,前面补0。代码很简单,两层循环:分别枚举十位数和个位数。

int main()
{
    for (int i = 0; i < 10; i++) {
        for (int j = 0; j < 10; j++) {
            std::cout << i << j << " ";
        }
    }
}

输出 n位以内的3进制数

低于n位的数,也要输出。不足n位的,前面补0到n位。

#include <iostream>
#include <functional>
#include <vector>
using namespace std;
int main()
{
    int n = 0;
    std::cout << "请输入n\r\n";
    std::cin >> n;
    vector<int> path;
    std::function<void()> BackTrack = [&]() {
        if (path.size() == n) {
            for (auto& tmp : path) {
                std::cout << tmp;
            }
            std::cout << " ";
            return;
        }
        for (int i = 0; i < 3; i++) {
            path.emplace_back(i);
            BackTrack();
            path.pop_back();
        }
    };
    BackTrack();
}

本题扩展:
一,输出m进制。
二,0,00,000分别输出。如:n=2 m=2,包括{0,1,00,01,10,11}

回溯总结

五点:
一,路径(状态),已经做出的选择。恢复状态主要针对它。
二,结束条件。
三,需要处理的路径。
四,子回溯,从选择列表中做出选择。
五,初始调用。
有些场景,在”结束条件“之前,还需要剪枝,去掉非法和被淘汰的分支。

在这里插入图片描述
时间复杂度:O(选择列表的长度层次) ,由于有大量剪枝,实际复杂度少得多。

教科书定义

回溯算法,又称为“试探法”。解决问题时,每进行一步,都是抱着试试看的态度,如果发现当前选择并不是最好的,或者这么走下去肯定达不到目标,立刻做回退操作重新选择。这种走不通就回退再走的方法就是回溯算法。
解决一个回溯问题,实际上就是一个决策树的遍历过程。你只需要思考 3 个问题:
1、路径:也就是已经做出的选择。
2、选择列表:也就是你当前可以做的选择。
3、结束条件:也就是到达决策树底层,无法再做选择的条件。

题解

回溯状态只需要知道路径层次难度分
【回溯 状态压缩 枚举】2151. 基于陈述统计最多好人数1797
【回溯】1255. 得分最高的单词集合1881
【状态压缩 枚举 回溯】1601. 最多可达成的换楼请求数目2118
【回溯 栈 代数系统 动态规划】282. 给表达式添加运算符
回溯状态需要栈难度分
【图论 回溯 广度优先搜索】126. 单词接龙 II
【回溯 图论】2065. 最大化一张图中的路径价值2178
难度分
【回溯 深度优先搜索】980. 不同路径 III1830
【回溯】1240. 铺瓷砖2241
【性能优化】 【回溯】 【字符串】1307. 口算难题2250
【回溯 字典树(前缀树)】212. 单词搜索 II
【回溯 代数系统】679. 24 点游戏
LeetCode37. 解数独
【回溯 网格 状态压缩】52. N 皇后 II

LeetCode暂无题解

140 301 691 996

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关下载

想高屋建瓴的学习算法,请下载《喜缺全书算法册》doc版
https://download.csdn.net/download/he_zhidan/88348653

我想对大家说的话
《喜缺全书算法册》以原理、正确性证明、总结为主。
闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

  • 104
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 39
    评论
C信息奥赛是一项关于信息技术和计算机科学的竞赛,其知识点涉及广泛且深入。以下是一些C信息奥赛的知识点: 1. 编程语言:C信息奥赛要求熟悉C语言的语法、数据类型、运算符和控制结构。同时,还需要了解有关C语言库函数和文件操作的知识。 2. 数据结构和算法:C信息奥赛考察了解和应用各种数据结构,如数组、链表、栈、队列和树等。此外,还要求掌握排序算法(如冒泡排序、快速排序和归并排序)和查找算法(如二分查找)。 3. 网络编程:了解网络编程是非常重要的,因为它涉及到通过网络进行数据传输和通信。要掌握TCP/IP协议、套接字编程和网络通信的基本原理。 4. 数据库:对于数据库的基本概念和技术也需要有所了解。包括关系型数据库(如MySQL、Oracle)和非关系型数据库(如MongoDB、Redis)的原理和操作方法。 5. 操作系统:熟悉操作系统的概念和原理,包括进程管理、内存管理和文件系统等。特别是对于Linux操作系统的使用和命令行操作有一定的要求。 6. 算法设计与分析:需要具备设计和分析算法的能力,了解动态规划、贪心算法、回溯算法和分治法等基本算法的思想和应用。 7. 计算机图形学:具备一定的图形学知识,掌握图形学基本概念、基本算法和编程库的使用。 总结起来,C信息奥赛的知识点主要包括编程语言、数据结构和算法、网络编程、数据库、操作系统、算法设计与分析以及计算机图形学等方面的知识。同时,熟练运用这些知识,能够解决各种实际的计算机科学问题,并在竞赛中取得好成绩。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 39
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

闻缺陷则喜何志丹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值