.DFS.

DFS

全称为Depth First Search,中文称为深度优先搜索。
这是一种用于遍历或搜索树或图的算法,其思想是:
沿着每一条可能的路径一个节点一个节点地往下搜索,
直到路径的终点,然后再回溯,直到所有路径搜索完为止。

DFS俗称爆搜,最重要的就是顺序
需要思考的是,应该用什么样的顺序来搜索答案
用树的形式展开
假设已经有n个空位了,那么就从第一个开始填,
从前向后一个空位一个空位的填充,且每一次填充的数字不能与前面填充的数字一样
深搜是优先向下走,即先填充好一条路径,填好后,会向前回溯。
每次存的都是当前的路径,回溯后前面的路径就不存在了,
所以整体看来是一棵树,实际上每次只能有一条分支,且最后回溯之后就什么也没了

题目:842. 排列数字 - AcWing题库

 思路:

思路挺简单的:一层for循环,如果当前的数没有被用过,那么就使用它。
st[i]表示当前的数是否被用过
path[x]用来储存将要被使用的数

这里dfs中,dfs的路径表示的是长度,即不断向下深搜
第二个for循环表示的是宽度,即向右深搜,直到找到一个没有被用过的数字。

tips
可以自己模拟一下,但是要注意该层dfs()结束的标志可以是第一层for循环结束,也可以是第二层for循环结束,而且在回溯的过程中,只要存在满足第二层循环里的if(!st[i])语句就会开辟新的路径,向下深搜

 代码:

#include<iostream>

using namespace std;

int path[10];
bool st[10];
int n;

void dfs(int x)
{
    //说明到最后一排——即走完了该条路径
    if(x==n)
    {
        for(int i=0;i<n;i++) cout << path[i] << " ";
        cout << endl;
    }
    else 
    {
        for(int i=1;i<=n;i++)
        {
            //false表示没有被用过
            if(!st[i])
            {
                path[x]=i;//使用i
                st[i]=true;//i被使用过了
                dfs(x+1);
                //清空上一路径的数值以及操作
                path[x]=0;
                st[i]=false;
            }
        }
    }
}
int main()
{
    cin >> n;
    
    dfs(0);
    
    return 0;
}

DFS+剪枝

剪枝,顾名思义就是减去某些枝条且是没用的枝条

返回到DFS中 就是在向下深搜的过程中,如果碰到了与题目要求不符的条件,那就停止向下深搜,转为向前回溯。即可以提前判断当前操作一定是不合法的,那么就没必要继续向下搜了,直接结束,向前回溯。该操作称之为剪枝。

题目:843. n-皇后问题 - AcWing题库

 思路:

题目要求:如果该点已经有皇后了,那么该点所在的行、列,正对角线、反对角线上都不能再有第二个皇后

边深搜便判断是否与题解相斥:如果与题目要求相斥,那么就停止向下搜索,转为向前回溯

不想手动模拟的话,那么可以看一看这一篇题解:AcWing 843. n-皇后问题--图解+代码注释 - AcWing

代码:

#include<iostream>

using namespace std;

const int N=20;
//记录棋盘布局
char cow[N][N];
//l[N]表示这一列是否含有女皇,dg[N]表示该女皇的正对角线是否含有女皇,udg[N]反对角线
int l[N],dg[N],udg[N];
int n;
//深度搜索每一行
void dfs(int u)
{
    if(u==n)
    {
        for(int i=0;i<n;i++)
        {
         for(int j=0;j<n;j++)
              printf("%c",cow[i][j]);
        printf("\n");
        }
        printf("\n");
    }
    
    for(int i=0;i<n;i++)
    {
        //如果满足该女皇所在列、对角线、反对角线都没有别的女皇的话
        if(!l[i] && !dg[u+i] && !udg[n-i+u])
        {
            //则在u行i列放下一个女皇
            cow[u][i]='Q';
            //则新放下女皇所在的列、正对角线、反对角线都不能再放置其他女皇了
            l[i]=dg[u+i]=udg[n-i+u]=true;
            //搜索下一行是否能放置女皇
            dfs(u+1);
            //还原现场
            l[i]=dg[u+i]=udg[n-i+u]=false;
            cow[u][i]='.';
        }
    }
    return;
}

int main()
{
    scanf("%d",&n);
    
    //初始化
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        cow[i][j]='.';
    }
    
    dfs(0);
    return 0;
}

tips:

dfs强烈建议手动模拟一下,要注意:dfs结束的方式不只是return,还有for循环的结束也会造成dfs的结束。这层dfs结束后就会执行上一个dfs剩下的“还原现场”的语句,接着根据是否结束本层for循环来决定是否结束上一个dfs语句。

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

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

相关文章

排序算法——上

一、冒泡排序&#xff1a; 1、冒泡排序算法的思想 我们从左边开始把相邻的两个数两两做比较&#xff0c;当一个元素大于右侧与它相邻的元素时&#xff0c;交换它们之间位置&#xff1b;反之&#xff0c;它们之间的位置不发生变化。冒泡排序是一种稳定的排序算法。 2、代码实现…

可燃气体报警器检测周期:如何合理设定以满足安全需求?

可燃气体报警器作为工业安全和生产环境中不可或缺的安全防护设备&#xff0c;其准确性、稳定性和及时响应性对于防止火灾和爆炸事故具有重要意义。 因此&#xff0c;合理设定并严格执行可燃气体报警器的检测周期&#xff0c;是确保安全与可靠运行的核心环节。 一、检测周期的重…

远程户外监控组网方案,工业4G路由器ZR2000

户外监控无人值守4G工业路由器组网应用涉及工业自动化、数据传输和远程监控的重要领域。在户外没有光纤的情况下&#xff0c;想要让监控或传感器等设备联网&#xff0c;仅需一台4G工业路由器即可解决。以下是关于远程监控户外组网的详细分析与应用&#xff1a; 物联网应用场景 …

Python 机器学习 基础 之 模型评估与改进 【评估指标与评分】的简单说明

Python 机器学习 基础 之 模型评估与改进 【评估指标与评分】的简单说明 目录 Python 机器学习 基础 之 模型评估与改进 【评估指标与评分】的简单说明 一、简单介绍 二、评估指标与评分 1、牢记最终目标 2、二分类指标 1&#xff09;错误类型 2&#xff09;不平衡数据集…

MySQL触发器实战:自动执行的秘密

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 &#x1f38f;&#xff1a;你只管努力&#xff0c;剩下的交给时间 &#x1f3e0; &#xff1a;小破站 MySQL触发器实战&#xff1a;自动执行的秘密 前言触发器的定义和作用触发器的定义和作用触发器的…

质量源于设计QbD培训的内容有哪些?

质量源于设计QbD培训的内容丰富而深入&#xff0c;旨在帮助企业深入理解并应用QbD理念&#xff0c;提升产品质量和客户满意度。以下是质量源于设计QbD培训的主要内容&#xff1a; 首先&#xff0c;培训将详细介绍QbD的基本概念、核心内容和实施流程。QbD是一种集成的方法&#…

大学搜题软件音乐类?分享三个支持答案和解析的工具 #微信#媒体

高效的学习工具可以帮助我们提高记忆力和理解能力&#xff0c;使知识更加深入人心。 1.彩虹搜题 这是个微信公众号 一款专门供全国大学生使用的查题神器!致力于帮助大学生解决学习上的难题,涵盖了大学生学习所需的学习资料。 下方附上一些测试的试题及答案 1、甲、乙合伙开…

python办公自动化——(二)替换PPT文档中图形数据-柱图

效果: 数据替换前 : 替换数据后: 实现代码 import collections.abc from pptx import Presentation from pptx.util import Cm,Pt import pyodbc import pandas as pd from pptx.chart.data import CategoryChartData…

OKR 实践:来自一位信息技术部主管的成功秘诀

OKR 实践&#xff1a;来自一位信息技术部主管的成功秘诀 为什么选择OKR 公司信息技术部为38个各地分公司、12,000名员工的IT需求提供服务。庞大而多样的客户群常常使我们的团队分散&#xff0c;许多团队都在各自为政&#xff0c;以个案为基础解决问题&#xff0c;而不是采用企业…

抖店的注意事项,2024新版,照做即可!

我是王路飞。 如果你想做抖店&#xff0c;但还没开通抖店的话&#xff0c;那这篇文章算你刷着了。 先别着急开店&#xff0c;把这篇文章看完&#xff0c;再开店也不迟&#xff0c;能帮你少走很多开店、做店阶段的弯路。 内容来源于【电商王路飞】 第一个注意事项&#xff0c…

基于瑞萨RA6M5的自控衣橱

1. 主控转接板原理图和PCB设计 2. 屏幕界面设计 3. 程序设计 4. QT设计 QT设计&#xff0c;读取MQTT数据&#xff0c;在QT上显示衣橱内部的温度&#xff0c;湿度情况&#xff0c;且能够控制衣橱的开关门&#xff0c;开关灯等。 5. 实物演示 瑞萨

Spring Boot中如何查询PGSQL分表后的数据

数据库用的pgsql&#xff0c;在表数据超过100w条的时候执行定时任务进行了分表&#xff0c;分表后表名命名为原的表名后面拼接时间&#xff0c;如原表名是card_device_trajectory_info&#xff0c;分表后拼接时间后得到card_device_trajectory_info_20240503&#xff0c;然后分…

CTF| 格式化字符串漏洞

格式化字符串漏洞是PWN题常见的考察点&#xff0c;仅次于栈溢出漏洞。漏洞原因&#xff1a;程序使用了格式化字符串作为参数&#xff0c;并且格式化字符串为用户可控。其中触发格式化字符串漏洞函数主要是printf、sprintf、fprintf、prin等C库中print家族的函数 0x01 格式化字符…

什么是死锁,如何解决?

一、问题解析 死锁是指两个或两个以上的进程&#xff08;或线程&#xff09;在执行过程中&#xff0c;由于竞争资源或者由于彼此通信而造成的一种阻塞的现象&#xff0c;若无外力作用&#xff0c;它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁&#xff0c;这些…

kettle组件之java代码,快速上手必看

我们先了解不同于java代码的kettle的一些方法 1、getRow()&#xff1b; 获取每一行数据&#xff0c;循环读数据&#xff1b;返回的是Object[]数组 2、get(Fields.in,"字段名"); 获取具体的某个字段的名称 3、get(Fields.in,"字段名").getString(r); …

100个AI Agent应用场景合集

人工智能代理&#xff08;AI Agent&#xff09;的发展正在以前所未有的速度改变我们的生活和工作方式。从日常生活的小事到企业级的复杂决策&#xff0c;AI Agent 的应用场景广泛且多样。 以下是 100 个 AI Agent 的创新应用场景&#xff0c;它们展示了 AI 技术如何渗透到我们生…

AI与空间设计的碰撞?

遇到难题不要怕&#xff01;厚德提问大佬答&#xff01; 厚德提问大佬答9 你是否对AI绘画感兴趣却无从下手&#xff1f;是否有很多疑问却苦于没有大佬解答带你飞&#xff1f;从此刻开始这些问题都将迎刃而解&#xff01;你感兴趣的话题&#xff0c;厚德云替你问&#xff0c;你解…

【Python】 Python中__slots__的妙用与深入解析

基本原理 在Python中&#xff0c;__slots__是一个特殊的类属性&#xff0c;它可以用来限制一个类可以拥有的属性数量。这个特性在Python中非常有用&#xff0c;尤其是在创建大量实例时&#xff0c;可以显著减少内存的使用。 通常&#xff0c;Python的类会为每个实例自动创建一…

一文解决弹窗交互设计难题,轻松上手

弹窗交互的分类 我们每天所说的弹出窗口是一个非常笼统的概念。我们习惯性地称所有的对话框、浮层和提示条为弹出窗口。事实上&#xff0c;弹出窗口可以分为两种类型&#xff1a;模态弹出框和非模态弹出框。在 UI 在设计中&#xff0c;当它迫使用户与之交互时&#xff0c;我们…

白酒:产地的水资源与酿酒工艺的关联性

云仓酒庄豪迈白酒的酿造过程中&#xff0c;水资源与酿酒工艺之间存在着密切的关联性。水是白酒酿造的重要原料之一&#xff0c;其质量和数量直接影响着酿酒工艺的实施和酒的品质。下面我们和云仓酒庄豪迈白酒来深入探讨一下&#xff0c;产地的水资源如何与酿酒工艺产生关联。 首…