码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 回溯 -- 21天学习挑战赛第一天


    ​
    ​

    活动地址:CSDN21天学习挑战赛

    文章目录

      • 什么是回溯?
        • 1. 回溯的基本定义
        • 2. 回溯的应用场景
      • 回溯例题套餐(实战!)
        • 1. 组合数
        • 2. 全排列

    什么是回溯?

    1. 回溯的基本定义

    回溯,计算机算法。回溯法也称试探法,它的基本思想是:从问题的某一种状态(初始状态)出发,搜索从这种状态出发所能达到的所有“状态”,当一条路走到“尽头”的时候(不能再前进),再后退一步或若干步,从另一种可能“状态”出发,继续搜索,直到所有的“路径”(状态)都试探过。这种不断“前进”、不断“回溯”寻找解的方法,就称作“回溯法”。

    2. 回溯的应用场景

    回溯法是对解空间的深度优先搜索,因此在一般情况下可用递归函数来实现。
    dfs
    组合,全排列,N皇后问题

    回溯例题套餐(实战!)

    1. 组合数

    (1)组合数,力扣77题
    这道题就是最基本的回溯问题,初始状态就是1,然后遍历到有两个数的时候达到终止条件,存入结果并return,这个时候重要的来了:
    在dfs()函数return之后,要恢复之前的状态,这道题就是temp的弹出末尾元素

    class Solution {
    public:
        vector<vector<int>> ans;
        vector<int> temp ;
        vector<bool> vis;
        int n ;
        void dfs(int x , int k)
        {
            if(temp.size() >= k)
            {
                ans.push_back(temp);
                return ;
            }
            for(int i = x; i <= n ; i++)
            {
                    temp.push_back(i);
                    dfs(i+1,k);
                    temp.pop_back();    
            }
        }
        vector<vector<int>> combine(int a, int k) {
            n = a ;
            dfs(1,k);
            return ans;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    还有一系列更难的组合题,可以搜一下力扣题目:组合

    2. 全排列

    ​acwing 842 排列数字

    在这里插入图片描述
    dfs(1) 从一开始,在dfs用一个for循环遍历,用一个b【】布尔数组来存是否放入vector,放入就变为true,递归回来的时候再恢复为false

    #include
    #include
    using namespace std;
    const int N = 10 ;
    int n ;
    int b[N];
    vector<int>q;
    void dfs(int x)
    {
        if(q.size() >= n)
        {
            for(auto x : q) cout << x << " " ;
            cout << endl;
            return ;
        }
        for(int i = 1  ; i <=n ; i++)
        {
            if(!b[i])
            {
                q.push_back(i);
                b[i] = true ;
                dfs(i+1);
                b[i] = false ;
                q.pop_back();
            }
            
        }
    }
    int main()
    {
        cin >> n ;
        dfs(1);
        return 0 ;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    请添加图片描述

    如果能帮助到大家的话,可以留下您宝贵的赞嘛,如果有任何问题都可以评论区或者私信我哦

  • 相关阅读:
    js、javascript中常见获取时间戳的方法
    Gitlab合并代码并解决冲突演示
    linux制作 ext4镜像image 脚本demo
    用正向迭代器封装实现反向迭代器
    Java 类集 习题
    自学前端——HTML篇
    计算机视觉的应用18-一键抠图人像与更换背景的项目应用,可扩展批量抠图与背景替换
    记一次To B开发普通的性能优化历程......报表优化
    python 删除pdf 空白页
    Docker入门
  • 原文地址:https://blog.csdn.net/weixin_51658930/article/details/126111266
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号