.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;//使用ist[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语句。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面向对象编程的魅力与实战:以坦克飞机大战为例

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、面向对象编程的引言 二、理解面向对象编程与面向过程编程的差异 三、创建类与对象&…

yolov8+ROS+ubuntu18.04——学习记录

参考文献 1.Ubuntu配置Yolov8环境并训练自己的数据集 ROS实时运行 2.https://juejin.cn/post/7313979467965874214 前提&#xff1a; 1.CUDA和Anaconda&#xff0c;PyTorch 2.python>3.8 一、创建激活环境&#xff0c;安装依赖 1.创建虚拟环境 conda create -n yol…

Java项目:基于SSM框架实现的企业人事管理系统单位人事管理系统【ssm+B/S架构+源码+数据库+毕业论文】

一、项目简介 本项目是一套基于SSM框架实现的企业人事管理系统单位人事管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观…

基于云开发快速搭建智能名片小程序

熏风徐来&#xff0c;麦穗摇曳&#xff1b;麦类等夏熟作物生长旺盛&#xff0c;籽粒灌浆渐趋饱满&#xff0c;但尚未完全成熟&#xff0c;故称“小满”。 今日小满&#xff0c;基于云开发快速搭建智能名片小程序&#xff0c;发文以记录输入和输出过程。 一、功能总览&#xff…

数据结构(五)队列

文章目录 一、概念二、逻辑结构&#xff1a;线性结构三、存储结构&#xff08;一&#xff09;顺序队列&#xff08;二&#xff09;循环队列1. 结构体定义2. 创建队列&#xff08;1&#xff09;函数定义&#xff08;2&#xff09;注意点&#xff08;3&#xff09;代码实现 3. 入…

学习100个Unity Shader (18) --- 几何着色器(Geometry Shader)

文章目录 概述编写格式举例应用举例&#xff08;用预制体球的每个顶点画一个立方体&#xff09;参考 概述 vertex shader --> [geometry shader] --> fragment shader。[]: 可选阶段。输入图元 —> geometry shader —> 其他图元 编写格式 [maxcertexcount(N)] …

什么是访问越界(C语言数组、指针、结构体成员访问越界)

在C语言中&#xff0c;访问越界&#xff08;Access Violation 或 Out-of-Bounds Access&#xff09;是指程序试图访问的内存位置超出了其合法或已分配的范围。这通常发生在数组、指针或其他内存结构的使用中。 案例&#xff1a; #include <stdio.h>//数组 //Visiting b…

基于Django的美团药品数据分析与可视化系统,有多用户功能,可增删改查数据

背景 随着电子商务和健康产业的迅速发展&#xff0c;药品行业数据的分析和可视化变得愈发重要。基于Django的美团药品数据分析与可视化系统的研究背景凸显了对药品数据的深入挖掘和分析的需求。该系统不仅具备多用户功能&#xff0c;允许不同角色的用户进行数据管理和分析&…

python列表生成式的妙用:区间内奇数求和

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、案例背景 三、实现步骤 四、案例验证 五、总结 一、引言 在Python编程中&a…

Java三种方法实现多线程,继承Thread类,实现Runnable接口,实现Callable接口

目录 线程&#xff1a; 继承Thread类&#xff1a; 实现Runnable类&#xff1a; 实现Callable接口&#xff1a; 验证多线程&#xff1a; 线程&#xff1a; 定义&#xff1a;进程可以同时执行多个任务&#xff0c;每个任务就是线程。举个例子&#xff1a;一个Java程序&#…

力扣刷题--LCR 075. 数组的相对排序【简单】

题目描述 给定两个数组&#xff0c;arr1 和 arr2&#xff0c; arr2 中的元素各不相同 arr2 中的每个元素都出现在 arr1 中 对 arr1 中的元素进行排序&#xff0c;使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。 …

实现UI显示在最上面的功能

同学们肯定遇到过UI被遮挡的情况&#xff0c;那如何让UI显示在最前面呢&#xff0c;先看效果 原理:UI的排序方式是和unityHierarchy窗口的层级顺序有关的&#xff0c;排序在下就越后显示&#xff0c;所以按照这个理论&#xff0c;当我们鼠标指到UI的时候把层级设置到最下层就好…

nacos(一) 安装

一 nacos 1.4.7安装 安装 nacos-server nacos官方下载 说明&#xff1a; 下载1.4.7和2.3.2版本,本专栏后续以1.4.7为例进行讲解补充&#xff1a; nacos-server服务端和nacos-client客户端附加&#xff1a; spring 版本、nacos-server、nacos-client版本要适配思考&#xf…

【Redis】Widows 和 Linux 下使用 Redis

Redis 简述 1.缓存 缓存就是将数据存放在距离计算最近的位置以加快处理速度。缓存是改善软件性能的第一手段,现代 CPU 越来越快的一个重要因素就是使用了更多的缓存,在复杂的软件设计中,缓存几乎无处不在。大型网站架构设计在很多方面都使用了缓存设计。 2.Redis Redis …

同元软控专业模型库系列—电气篇

一、引言 电气作为研究电能产生、传输、分配、使用和控制的专业领域&#xff0c;在航空航天、能源电力、船舶推进、轨道交通等众多行业中占据着举足轻重的地位&#xff0c;应用范围涉及电力工程、电子通信、自动化控制等&#xff0c;如电池充电管理芯片设计、航天器伺服系统、…

GitHub Copilot如何订阅使用

1.Copilot是什么 Copilot是由Github和OpenAI联合开发的一个基于人工智能大模型的代码写作工具。 我们都知道Github是世界上拥有开源项目及代码最多的一个平台&#xff0c;有了这么一个得天独厚的资源&#xff0c;Github联合OpenAI喂出了Copilot。经过不断地更新迭代&#xff…

Word整理论文参考文献

1.安装Zotero软件 2.安装Zotero的Chrome网站插件&#xff0c;并将插件固定到浏览器 3.安装Word的Zotero插件 4.在DBLP网站https://dblp.org/search 搜索需要添加的参考文献->点击BibTex->点击网页右上角的Zotero符号&#xff08;即第二步所指的符号&#xff09;->至…

红队攻防渗透技术实战流程:红队目标上线之webshell工具魔改

红队攻防免杀实战 1. 红队目标上线-Webshell免杀-源码魔改1.2 Webshell-代码混淆&流量绕过&工具原理1.2 通过对冰蝎的数据包分析:1.2魔改冰蝎-JAR反编译打包构建1.2魔改冰蝎-防识别-打乱特征指纹1.2魔改冰蝎-防查杀-新增加密协议1. 红队目标上线-Webshell免杀-源码魔改…

[转载]同一台电脑同时使用GitHub和GitLab

原文地址&#xff1a;https://developer.aliyun.com/article/893801 简介&#xff1a; 工作中我们有时可能会在同一台电脑上使用多个git账号&#xff0c;例如&#xff1a;公司的gitLab账号&#xff0c;个人的gitHub账号。怎样才能在使用gitlab与github时&#xff0c;切换成对应…

民国漫画杂志《时代漫画》第27期.PDF

时代漫画27.PDF: https://url03.ctfile.com/f/1779803-1248635258-b6a842?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了&#xff0c;截止1937年6月战争来临被迫停刊共发行了39期。 ps: 资源来源网络!