搜索算法(三) 回溯法

1.回溯法

回溯法可以理解成一种特殊的深度优先算法,比起普通的DFS,多了还原当前节点的一步。

修改当前节点、递归子节点、还原当前节点。

本质是一种试错的思想。

维基百科:

 2.例题

1)

力扣https://leetcode.cn/problems/permutations/修改和还原当前节点放在了dfs函数的开头和结尾,中间遍历未访问的节点,递归访问这些节点。

class Solution {
public:
    vector<vector<int>> permute(vector<int>& nums) {
        int n = nums.size();
        vector<bool> visit(n,false);
        vector<int> ans;
        for(int i=0;i<n;i++){
            dfs(nums,visit,i,ans);
        }

        return res;
    }

    void dfs(vector<int>& nums, vector<bool>& visit, int k, vector<int>& ans){
        visit[k] = true;
        ans.push_back(nums[k]);
        int n = nums.size();
        if(ans.size()==n){
            res.push_back(ans);
        }else{
            for(int i=0;i<n;i++){
            if(!visit[i]){
                dfs(nums,visit,i,ans);
                }
            }
        }
        visit[k] = false;
        ans.pop_back();
    }

private:
    vector<vector<int>> res;    
};

2)

力扣https://leetcode.cn/problems/combinations/这题与上一题类似,只是停止搜索的条件变为组合长度为k

class Solution {
public:
    vector<vector<int>> combine(int n, int k) {
        vector<int> ans;
        for(int i=1;i<=n;i++){
            dfs(i,n,k,ans);
        }

        return res;
    }

    void dfs(int start, int n, int k, vector<int>& ans){
        ans.push_back(start);
        if(ans.size()==k){
            res.push_back(ans);
        }else{
            for(int i=start+1;i<=n;i++){
                dfs(i,n,k,ans);
            }
        }
        ans.pop_back();
    }

private:
    vector<vector<int>> res;
};

3)

力扣https://leetcode.cn/problems/word-search/这题也是一样的回溯结构,深搜符合条件的路径

class Solution {
public:
    bool exist(vector<vector<char>>& board, string word) {
        int m = board.size();
        int n = board[0].size();
        vector<vector<bool>> visit(m,vector<bool>(n,false));
        bool res;
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(board[i][j]==word[0]){
                    res = dfs(board,word,i,j,1,visit);
                    if(res==true){
                        return true;
                    }
                }
            }
        }
        return false;
    }

    bool dfs(vector<vector<char>>& board, string word, int a, int b, int x, vector<vector<bool>>& visit){
        if(word.size()==x) return true;
        visit[a][b] = true;
        int m = board.size();
        int n = board[0].size();
        for(int i=0;i<4;i++){
            int c = a + path[i];
            int d = b + path[i+1];
            if(c>=0 && c<m && d>=0 && d<n && visit[c][d]==false && 
                word[x]==board[c][d]){
                    if(dfs(board,word,c,d,x+1,visit)){
                        return true;
                    }
                }
        }
        visit[a][b] = false;
        return false;
    }
private:
    vector<int> path{-1,0,1,0,-1};
};

4)

力扣https://leetcode.cn/problems/n-queens/N皇后是经典的回溯问题,一行一行地放置皇后,每次放置前,判断一下是否符合每列每斜线只有有一个皇后的约束。放置皇后后,继续深搜下一行可能的放置方式,搜索完毕后,取消放置该行皇后。

class Solution {
public:
    vector<vector<string>> solveNQueens(int n) {
        vector<string> ans(n,string(n,'.'));
        dfs(0,n,ans);
        return res;
    }

    void dfs(int start, int n, vector<string>& ans){
       
        if(start==n){
            res.push_back(ans);
            return;
        }
        for(int i=0;i<n;i++){
             if(judge(ans,start,i)){
                ans[start][i] = 'Q';
                dfs(start+1, n, ans);
                ans[start][i] = '.';
             }
           
        }
    }

    bool judge(vector<string>& ans, int x, int y){
       int n = ans.size();
       for(int i=0;i<n;i++){
           if(ans[i][y]=='Q'){
               return false;
           }
       }
       for(int i=x-1, j=y-1;i>=0&&j>=0;i--,j--){
           if(ans[i][j]=='Q'){
               return false;
           }
       }
       for(int i=x-1,j=y+1;i>=0&&j<n;i--,j++){
           if(ans[i][j]=='Q'){
               return false;
           }
       }
       return true;
    }

private:
    vector<vector<string>> res;
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/26697.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

17_Linux根文件简介与Busybox构建文件系统

目录 根文件系统简介 文件目录简介 BusyBox简介 编译BusyBox构建根文件系统 修改Makefile添加编译器 busybox中文字符支持 配置 busybox 编译busybox 向根文件系统添加lib库 向rootfs的“usr/lib”目录添加库文件 创建其他文件夹 根文件系统初步测试 根文件系统简介…

行业应用|立仪光谱共焦位移传感器在玻璃方面的检测

项目&#xff1a;玻璃管管壁单边测厚 行业应用|立仪光谱共焦位移传感器在玻璃方面的检测 行业应用|立仪光谱共焦位移传感器在玻璃方面的检测 检测方案 用D35A7镜头对玻璃管管壁进行单边测厚&#xff0c;取三个点静态测量厚度并记录重复性。 1、采用D35A7R2S35镜头对玻璃管管…

Android Input子系统 - kernel

目录 前言 数据结构 输入子系统流程 前言 上一节有展示Android Input子系统的架构图,这里我们关心Linux kernel层 可以看到kernel层分为三层: 输入子系统设备驱动:处理与硬件相关的信息,调用input API注册输入设备,并把数据往上报 输入子系统核心层:为事件处理层和设…

Python之并发多线程操作

一、threading模块介绍 multiprocess模块的完全模仿了threading模块的接口&#xff0c;二者在使用层面&#xff0c;有很大的相似性 二、开启线程的两种方式 方式一 #方式一 from threading import Thread import time def sayhi(name):time.sleep(2)print(%s say hello %na…

迷你版ChatGPT开源,教你怎么用nanoGPT训练一个写小说的AI机器人!

大家好,我是千与千寻,好久不见,最近太忙了,去医院拔了颗智齿,这不是刚休息一天,就立刻来给大家分享ChatGPT的新奇项目了。 ChatGPT的功能确实是好用,但是我觉得有一个小缺点,就是反应的时间比较慢,原因是GPT-3.5/GPT-4.0的模型体积较大,比较占用内存空间。 同时大模…

10.ES6模块化规范(关键字 import,from,as,export的用法)

导入其他模块成员要使用关键字 import &#xff0c;导出需要使用关键字 export 我们明确一个概念&#xff0c;只有js与js之间需要使用import与export&#xff0c;如果是在html中引入js是不需要用import的&#xff0c;你导入的方式是直接srcxxx.js 目录 1 默认导入导出 2 …

【高危】Apache Inlong 存在JDBC反序列化漏洞

漏洞描述 Apache InLong 是可用于构建基于流式的数据分析、建模等一站式的海量数据集成框架。 在Apache Inlong受影响版本&#xff0c;由于未对接收的jdbcUrl参数过滤空格字符&#xff0c;导致可以利用空格绕过jdbcUrl中autoDeserialize参数过滤限制&#xff0c;通过认证的攻…

尚硅谷JUC极速版笔记

尚硅谷JUC极速版笔记 1、JUC概述1.1 进程和线程1.2 线程的状态&#xff08;6个&#xff09;1.3 wait和sleep1.4 并发与并行1.5 管程&#xff08;锁&#xff09;1.6 用户线程和守护线程 2、Lock接口2.1 复习synchronized&#xff08;java内置同步锁&#xff09;2.2 什么是Lock接…

设计模式详解之策略模式

作者&#xff1a;刘文慧 策略模式是一种应用广泛的行为型模式&#xff0c;核心思想是对算法进行封装&#xff0c;委派给不同对象来管理&#xff0c;本文将着眼于策略模式进行分享。 一、概述 我们在进行软件开发时要想实现可维护、可扩展&#xff0c;就需要尽量复用代码&#x…

LayUI前框框架普及版

LayUI 一、课程目标 1. 【了解】LayUI框架 2. 【理解】LayUI基础使用 3. 【掌握】LayUI页面元素 4. 【掌握】LayUI内置模块二、LayUI基本使用 2.1 概念 layui&#xff08;谐音&#xff1a;类UI) 是一款采用自身模块规范编写的前端 UI 框架&#xff0…

阿里云nginx配置https踩坑(配置完后访问显示无法访问此网站)

本人小前端一枚&#xff0c;最近在玩服务器部署自己的东西时踩了个坑&#xff01;&#xff01;&#xff01; server {listen 443 ssl;server_name localhost;ssl_certificate 证书.com.pem;ssl_certificate_key 证书.com.key;#后台管理静态资源存放location / { #文件目…

springboot+vue新闻稿件java在线投稿管理系统

本文介绍了新闻稿件管理系统的开发全过程。通过分析新闻稿件管理系统管理的不足&#xff0c;创建了一个计算机管理新闻稿件管理系统的方案。文章介绍了新闻稿件管理系统的系统分析部分&#xff0c;包括可行性分析等&#xff0c;系统设计部分主要介绍了系统功能设计和数据库设计…

微信小程序开发实战 ②②(全局数据共享)

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; 微信小程序 &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &#x1f4…

基于flask的web应用开发——访问漂亮的html页面以及页面跳转

目录 0. 前言1. html基本知识2. 编写html文本3. 在Flask中设置访问html4. 实现点击跳转 0. 前言 本节学习如何在flask应用程序下让用户访问你提前制作好的html页面 操作系统&#xff1a;Windows10 专业版 开发环境&#xff1a;Pycahrm Comunity 2022.3 Python解释器版本&am…

Arcgis进阶篇(6)——如何将Arcgis Pro的离线数据发布成服务

常常因为Arcgis Server&#xff08;或者GeoScene Server&#xff09;昂贵的价格&#xff0c;而导致小项目技术选型选择开源的GIS Server&#xff08;如GeoServer等&#xff09;。但用完之后&#xff0c;发现后者实在拉跨&#xff0c;使用对比差异巨大。那就只能另想办法&#x…

基于轻量级YOLOv5n/s/m三款模型开发构建基于无人机视角的高空红外目标检测识别分析系统,对比测试分析性能

有关于无人机目标检测和红外场景下的目标检测的项目在我之前的文章中都有实践经历了&#xff0c;但是将无人机和红外场景结合的目标检测项目还是很少的&#xff0c;本文的核心想法就是基于高空无人机场景开发构建目标检测系统。 前面相关博文如下&#xff0c;感兴趣的话可以自…

Ubuntu本地快速搭建web小游戏网站,公网用户远程访问【内网穿透】

文章目录 前言1. 本地环境服务搭建2. 局域网测试访问3. 内网穿透3.1 ubuntu本地安装cpolar内网穿透3.2 创建隧道3.3 测试公网访问 4. 配置固定二级子域名4.1 保留一个二级子域名4.2 配置二级子域名4.3 测试访问公网固定二级子域名 转载自cpolar极点云的文章&#xff1a;在Ubunt…

BGP状态机

BGP协议基本概念 BGP是一种外部网管协议(EGP),与OSPF、RIP等内部网管协议(IGP)不同,其着眼点不在于自动发现网络拓扑,而在于AS之间选择最佳路由和控制路由的传播。 自治系统AS( Autonomous System) 由同一个技术管理机构管理、使用统一选路策略的一些路由器的集合。 …

CDN如何进行内容缓存与内容预热

CDN的启用与管理 1、打开火伞云融合CDN系统控制后台-CDN管理 2、查看加速域名下的全部CDN服务&#xff0c;可以看到有部分厂商暂时处于未启用状态&#xff0c;这是因为这些厂商要求进行域名所有权校验后方可使用&#xff08;如果已经处于已启用状态的厂商则不用额外进行操作&…

Redis数据类型之String——字符串、数值、bitmap

Redis数据类型之String——字符串、数值、bitmap 注意索引位置一般从左到右 0开始&#xff0c;叫正向索引。从右到左-1开始叫反向索引 字符串 字符串有很多操作set、get、append、setrange、getrange等&#xff0c;每个都有自己对应的用处 SET SET key value 设置指定 key …