【算法】DFS与BFS
作者:指针不指南吗
专栏:算法篇🐾题目的模拟很重要!!🐾
文章目录
- 1.区别
- 2.DFS
- 2.1 排列数字
- 2.2 n-皇后问题
- 3.BFS
- 3.1走迷宫
1.区别
| 搜索类型 | 数据结构 | 空间 | 用途 | 过程 |
|---|---|---|---|---|
| DFS | stack | O( n ) | 不能用于最短路 | 搜索到最深处,回溯 |
| BFS | queue | O( n2n^2n2 ) | 可以用于最短路 | 从起点开始,搜索相邻的;再以相邻的位起点,继续 |
这里用两个图来形象的模拟过程
深搜——一条路走到黑

广搜——眼观八方

2.DFS
-
每一个DFS都对应一个搜索树;
-
DFS俗称暴搜,其中有顺序的,经常用到DFS;
-
回溯的时候一定要恢复现场;
-
剪枝就是判断出来当前的方案不合法,不再继续往下深搜,直接回溯;
只说知识,有点抽象,根据两个题来理解一下。
2.1 排列数字
给定一个整数 n,将数字 1∼n 排成一排,将会有很多种排列方法。
现在,请你按照字典序将所有的排列方法输出。
输入格式
共一行,包含一个整数 n。
输出格式
按字典序输出所有排列方案,每个方案占一行。
数据范围
1≤n≤7
输入样例:
3输出样例:
1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1
- 思路
图转自acwing以3的全排列为例
-
代码实现
#include<bits/stdc++.h> using namespace std;int n; int path[10];// path 数组保存排列,当排列的长度为 n 时,是一种方案,输出 bool st[10];//st 数组表示数字是否用过:当 st[i] 为 1 时,i 已经被用过,否则 没有被用过void dfs(int u) //dfs(u) 表示:在 path[i] 处填写数字,然后递归的在下一个 u 位置填写数字 {if(u==n){for(int i=0;i<n;i++) cout<<path[i]<<' '; //是一种方案输出cout<<endl;return ;}for(int i=1;i<=n;i++){if(!st[i]) //i 没有被使用过,现在使用{st[i]=true; //状态 改成使用过path[u]=i; //在方案中填上这个数dfs(u+1); //填下一个位置上的数st[i]=false; //回溯:第 i 个位置填写某个数字的所有情况都遍历后, 第 i 个位置填写下一个数字}} }int main() {cin>>n;dfs(0); //从第0个位置上,开始递归,搜索return 0; }
2.2 n-皇后问题
n−皇后问题是指将 n 个皇后放在 n×n 的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。
现在给定整数 n,请你输出所有的满足条件的棋子摆法。
输入格式
共一行,包含整数 n。
输出格式
每个解决方案占 n 行,每行输出一个长度为 n 的字符串,用来表示完整的棋盘状态。
其中
.表示某一个位置的方格状态为空,Q表示某一个位置的方格上摆着皇后。每个方案输出完成后,输出一个空行。
注意:行末不能有多余空格。
输出方案的顺序任意,只要不重复且没有遗漏即可。
数据范围
1≤n≤9
输入样例:
4输出样例:
.Q.. ...Q Q... ..Q...Q. Q... ...Q .Q..
方法一
-
思路
棋盘皇后这个题,和数的全排列很相似
按行枚举,枚举的时候,就保证了行不会重复;
开始放置棋子,第
u行第i列 看看是否可以放皇后,可以就放,递归下一行u+1直到最后,全部 n 个皇后放上棋盘
图解如下
图转自acwing
-
代码实现
#include<bits/stdc++.h> using namespace std;int n; const int N=20; char q[N][N]; //存储棋盘 bool cor[N],dg[2*N],udg[2*N]; //cor表示每一列,dg和udg表示正对角线和反对角线,来存储他们的是否被使用过的状态 void dfs(int u) //放第 u 行的棋子 (深度优先遍历) {if(u==n) //如果放盘,则输出棋盘{for(int i=0;i<n;i++){for(int j=0;j<n;j++)cout<<q[i][j];cout<<endl;}cout<<endl;return ; //重点!! 递归到最深层,返回,千万别忘记}for(int i=0;i<n;i++) //从第一列,开始遍历,是否放棋{if(!col[i]&&!dg[i+u]&&!udg[n-i+u]) //如果 列,对角线,没有被放过,则放皇后{q[u][i]='Q'; //放上col[i]=dg[i+u]=udg[n-i+u]=true; //改变状态,dg[i+u]表示截距,每个对角线,都有自己独有的截距;反对角线的截距是负数,数组的下标,不能存放负数,所以加上 n这个偏移量dfs(u+1); //放下一行的col[i]=dg[i+u]=udg[n-i+u]=false; //恢复现场q[u][i]='.';}} }int main() {cin>>n;for(int i=0;i<n;i++)for(int j=0;j<n;j++)q[i][j]='.'; //初始化棋盘dfs(0); //从第0行,开始放棋子return 0; }
方法二
-
思路
枚举 每一个位置的棋子
每个位置可以分成两种情况:放
Q不放Q把每一种情况都枚举出来
-
代码实现
#include<bits/stdc++.h> using namespace std;int n; const int N=20; char q[N][N]; bool row[N], col[N],dg[N],udg[N];void dfs(int x,int y,int s) //x表示行,y表示列,s表示已经放上皇后的个数 {//处理超边界地情况if(y==n) y=0,x++; if(x==n) //每个位置都枚举完了{if(s==n) // n 个皇后都放上去了{for(int i=0;i<n;i++)puts(q[i]); //输出棋盘, q[i],传的是数组指针,输出的是一整行puts("");}return ; //递归到最后返回}//分支1,不放皇后dfs(x,y+1,s);//分支2,放皇后if(!row[x]&&!col[y]&&!dg[x+y]&&!udg[n-x+y]){q[x][y]='Q';row[x]=col[y]=dg[x+y]=udg[n-x+y]=true;dfs(x,y+1,s+1);row[x]=col[y]=dg[x+y]=udg[n-x+y]=false;q[x][y]='.';}}int main() {cin>>n;for(int i=0;i<n;i++)for(int j=0;j<n;j++)q[i][j]='.';dfs(0,0,0);return 0; }
3.BFS
比较简单,一般模板可以直接解决
直接上例题,来理解一下
3.1走迷宫
给定一个 n×m 的二维整数数组,用来表示一个迷宫,数组中只包含 00 或 11,其中 00 表示可以走的路,11 表示不可通过的墙壁。
最初,有一个人位于左上角 (1,1)处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。
请问,该人从左上角移动至右下角 (n,m) 处,至少需要移动多少次。
数据保证 (1,1) 处和 (n,m) 处的数字为 0,且一定至少存在一条通路。
输入格式
第一行包含两个整数 n 和 m。
接下来 n 行,每行包含 m 个整数(0 或 1),表示完整的二维数组迷宫。
输出格式
输出一个整数,表示从左上角移动至右下角的最少移动次数。
数据范围
1≤n,m≤100
输入样例:
5 5 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0输出样例:
8
-
思路
从起点开始,遍历每一个位置,
看他四个方向,是否满足条件,满足条件的,走它,
在看它的四个方向是否满足条件,满足走它
每走一步,距离+1,
最后返回 走到 终点 的距离
图解如下
图转自acwing
-
代码实现
#include<bits/stdc++.h> using namespace std;typedef pair<int ,int> PII; //定义 坐标const int N=110;int n,m; int g[N][N]; //表示地图 int d[N][N]; //存的是某一点到源点的距离int dfs() {queue<PII> q; //定义队列,里面存的表示我们将要走的哪一个点q.push({0,0}); //先把放进去,表示我们要走 起点memset(d,-1,sizeof d); //初始化,把每个点到源点的距离初始化为 -1d[0][0]=0; //源点到自己的距离为0int dx[4]={0,0,-1,1},dy[4]={1,-1,0,0}; //我们定义的四个方向 x,y 的移动,这样可以避免 4个判断语句,注意 dx,dy 要一一对应//从第一个开始位置开始遍历while(!q.empty()) //走到最后{auto t=q.front(); //把队列中的第一个元素取出来q.pop(); //对头元素出列for(int i=0;i<4;i++){int x=t.first+dx[i],y=t.second+dy[i]; //扩展之后的坐标//x,y不能越界,可以走,没走过if(x>=0&&x<n&&y>=0&&y<m&&g[t.first][t.second]==0&&d[x][y]==-1){d[x][y]=d[t.first][t.second]+1; //距离+1q.push({x,y}); //把把满足条件地坐标插进去,下一次走它们}}}return d[n-1][m-1]; //返回最后一个即终点到源点地距离 }int main() {cin>>n>>m;for(int i=0;i<n;i++)for(int j=0;j<m;j++)cin>>g[i][j]; //读入地图cout<<dfs()<<endl;return 0; }

相关文章:
【算法】DFS与BFS
作者:指针不指南吗 专栏:算法篇 🐾题目的模拟很重要!!🐾 文章目录1.区别2.DFS2.1 排列数字2.2 n-皇后问题3.BFS3.1走迷宫1.区别 搜索类型数据结构空间用途过程DFSstackO( n )不能用于最短路搜索到最深处&a…...
湖州银行冲刺A股上市:计划募资约24亿元,资产质量水平较高
3月4日,湖州银行股份有限公司(下称“湖州银行”)递交招股书,准备在上海证券交易所主板上市。本次冲刺上市,湖州银行计划募资23.98亿元,将在扣除发行费用后全部用于补充该行资本金。 湖州银行在招股书中表示…...
高性能网络I/O框架-netmap源码分析
前几天听一个朋友提到这个netmap,看了它的介绍和设计,确实是个好东西。其设计思想与业界不谋而合——因为为了提高性能,几个性能瓶颈放在那里,解决方法自然也是类似的。 netmap的出现,它既实现了一个高性能的网络I/O框…...
SpringBoot监听机制-以及使用
11-SpringBoot事件监听 Java中的事件监听机制定义了以下几个角色: ①事件:Event,继承 java.util.EventObject 类的对象 ②事件源:Source ,任意对象Object ③监听器:Listener,实现 java.util…...
若依学习——定时任务代码逻辑 详细梳理(springboot整合Quartz)
springboot整合Quartz关于若依定时任务的使用可以去看视频默认定时任务的使用关于springboot整合quartz的整合参考(150条消息) 定时任务框架Quartz-(一)Quartz入门与Demo搭建_quarzt_是Guava不是瓜娃的博客-CSDN博客(150条消息) SpringBoot整合Quartz_springboot quartz_桐花思…...
C++---最长上升子序列模型---拦截导弹(每日一道算法2023.3.4)
注意事项: 本题为"线性dp—最长上升子序列的长度"的扩展题,这里只讲贪心思路,dp去这个看。 题目: 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。 但是这种导弹拦截系统有一个缺陷:虽然它…...
【机器学习面试】百面机器学习笔记和问题总结+扩展面试题
第1章 特征工程 1、为什么需要对数值类型的特征做归一化? (1)消除量纲,将所有特征统一到一个大致相同的区间范围,使不同指标之间具由可比性; (2)可以加快梯度下降收敛的速度&#…...
【2021.12.28】ctf逆向中的迷宫问题(含exe及wp)
【2021.12.28】ctf逆向中的迷宫问题(含exe及wp) 文章目录【2021.12.28】ctf逆向中的迷宫问题(含exe及wp)1、迷宫简介(1)简单例子(2)一般的迷宫代码2、二维迷宫(1…...
WSL2使用Nvidia-Docker实现深度学习环境自由部署
1. Win11 显卡驱动的安装 注意:WSL2中是不需要且不能安装任何显卡驱动的,它的显卡驱动完全依赖于 Win11 中的显卡驱动,因此我们只需要安装你显卡对应的 Win11 版本显卡驱动版本(必须是 Win11 版本的驱动),…...
SpringBoot入门 - 配置热部署devtools工具
在SpringBoot开发调试中,如果我每行代码的修改都需要重启启动再调试,可能比较费时间;SpringBoot团队针对此问题提供了spring-boot-devtools(简称devtools)插件,它试图提升开发调试的效率。准备知识点什么是…...
CANFDNET-200U-UDP配置与数据收发控制
一、启动ZCANPRP,打开设备管理页面,选择类型CANFDNET-200U-UDP,如图1 图1 二、打开设备,启动,在相应页面如图2,配置协议,CANFD 加速,本地端口,IP地址,工作端口。 图2 三、发送相应数…...
嵌入式中backtrace的使用
大家好,我是bug菌~ backtrace主要用于调试程序时,能够打印出程序在运行过程中的函数调用栈,以帮助开发者快速定位程序出现异常或崩溃的原因。 通过backtrace的输出,开发者可以了解程序在哪个函数出现问题,…...
CV学习笔记-Faster-RCNN
Faster R-CNN 文章目录Faster R-CNN1. 目标检测算法1.1 计算机视觉有五大应用1.2 目标检测任务1.3 目标检测算法概述2. 边框回归(Bounding-Box regression)2.1 IoU2.2 统计学中的指标2.3 边框回归3. Faster-RCNN网络3.1 Conv layers3.2 Region Proposal …...
大型三甲医院云HIS系统源码 强大的电子病历+完整文档
医院HIS系统源码云HIS系统:SaaS运维平台多医院入驻强大的电子病历完整文档 有源码,有演示 一、系统概述 采用主流成熟技术,软件结构简洁、代码规范易阅读,SaaS应用,全浏览器访问前后端分离,多服务协同&am…...
如何使用Spring Cloud搭建高可用的Elasticsearch集群?详解Elasticsearch的安装与配置及Spring Boot集成的实现
Spring Cloud 是一个基于 Spring Boot 的微服务框架,它提供了一系列组件和工具,方便开发人员快速搭建和管理分布式系统。Elasticsearch 是一个开源的全文搜索引擎,也是一个分布式、高可用的 NoSQL 数据库。本篇博客将详细讲解如何使用 Spring…...
phpinfo包含临时文件Getshell全过程及源码
目录 前言 原理 漏洞复现 靶场环境 源码 复现过程 前言 PHP LFI本地文件包含漏洞主要是包含本地服务器上存储的一些文件,例如session文件、日志文件、临时文件等。但是,只有我们能够控制包含的文件存储我们的恶意代码才能拿到服务器权限。假如在服…...
ubuntu22.04 Desktop 服务器安装
操作系统 使用的是Uubntu22.04 Desktop的版本,系统安装后,默认开启了53端口和631端口 关闭udp 5353、53791端口(avahi-daemon服务) sudo systemctl stop avahi-daemon.socket avahi-daemon.service sudo systemctl disable ava…...
Halcon——关于halcon中的一些语法
Halcon——关于halcon中的一些语法前言一、变量的创建与赋值二、if语句三、for语句四、while语句五、中断语句六、switch语句总结前言 在HDevelep环境下编程时,所用的一些语法与C#有些差异,在此做下记录。 一、变量的创建与赋值 Hdevelep中调用函数时&…...
Java 循环语句
Java 循环语句 循环语句就是在满足一定条件的情况下反复执行某一个操作的语句。Java中提供了3种常用的循环语句,分别是while循环语句、do…while循环语句和for循环语句。 1.while循环语句 while语句也称条件判断语句,它的循环方式为利用一个条件来控制…...
Python 基础语法
文章目录条件判断循环数据类型变量字符编码字符串格式化listtupledictset不可变对象”#“ 开头的是注释每一行是一个语句,当语句以冒号 “:” 结尾时,缩进的语句被视为代码块 好处:强迫代码格式化,强迫少用缩进 坏处:“…...
Boss-Key终极指南:3分钟掌握Windows隐私保护神器
Boss-Key终极指南:3分钟掌握Windows隐私保护神器 【免费下载链接】Boss-Key 老板来了?快用Boss-Key老板键一键隐藏静音当前窗口!上班摸鱼必备神器 项目地址: https://gitcode.com/gh_mirrors/bo/Boss-Key 在数字化办公时代,…...
3个核心功能解决Windows 11系统问题:Win11Debloat优化工具深度评测
3个核心功能解决Windows 11系统问题:Win11Debloat优化工具深度评测 【免费下载链接】Win11Debloat 一个简单的PowerShell脚本,用于从Windows中移除预装的无用软件,禁用遥测,从Windows搜索中移除Bing,以及执行各种其他更…...
LVGL下拉列表控件lv_dropdown实战:从基础配置到高级定制(附完整代码示例)
LVGL下拉列表控件lv_dropdown实战:从基础配置到高级定制(附完整代码示例) 在嵌入式UI开发领域,LVGL(Light and Versatile Graphics Library)凭借其轻量级和高度可定制的特性,已成为许多开发者的…...
本地部署开源直播视频平台 Owncast 并实现外部访问
Owncast 是一款开源的、自托管的直播和视频平台,它允许用户完全掌控自己的直播基础设施、数据和观众互动,避免依赖 Twitch 、YouTube 等大型中心化平台,为内容创作者提供一个独立、去中心化的直播解决方案。本文将详细介绍如何利用 Docker 在…...
Hi-C数据分析进阶:如何用dcHiC精准识别癌症样本中的区室转换事件?
Hi-C技术解密:从染色质区室动态到癌症表观遗传调控 染色质三维结构研究已成为癌症表观遗传学的前沿领域。随着Hi-C技术的普及,科学家们能够以前所未有的分辨率观察基因组在细胞核内的空间组织形式。本文将深入探讨染色质区室(A/B compartment…...
5分钟搞定KEPserver V6配置:Java读取西门子PLC数据的保姆级教程
5分钟极速配置KEPserver V6与Java通信:西门子S7-1500数据采集实战指南 当工业现场的PLC数据需要与IT系统集成时,OPC技术栈往往是最直接的选择。但传统OPC配置过程繁琐的文档和复杂的依赖管理,常让工程师在项目初期耗费大量时间在环境搭建上。…...
【单片机实战】中断服务程序编写精要:从现场保护到中断返回
1. 中断服务程序的核心作用与基本结构 第一次接触单片机中断时,我盯着开发板上的按键发愣——明明没有循环检测IO口状态,按下按键却能立即触发LED亮灭。这种"随叫随到"的响应机制,就是中断服务程序(ISR)的魔…...
如何利用多渠道SEO推广提高网站流量
<h2>多渠道SEO推广:如何提高网站流量</h2> <p>在当前竞争激烈的互联网环境中,网站流量是衡量网站成功与否的重要指标之一。如何利用多渠道SEO推广提高网站流量,成为了每一个网站运营者关注的焦点。本文将从问题分析、原因说…...
告别996!用Google Antigravity的Agent-First模式,5分钟搞定React Native与Android原生桥接模块
告别996!用Google Antigravity的Agent-First模式,5分钟搞定React Native与Android原生桥接模块 如果你是一位长期奋战在Android与React Native混合开发一线的工程师,一定对"桥接模块"这个词汇又爱又恨。每当产品经理提出"我们…...
TouchGal:一站式Galgame社区解决方案终极指南
TouchGal:一站式Galgame社区解决方案终极指南 【免费下载链接】kun-touchgal-next TouchGAL是立足于分享快乐的一站式Galgame文化社区, 为Gal爱好者提供一片净土! 项目地址: https://gitcode.com/gh_mirrors/ku/kun-touchgal-next 还在为寻找Galgame资源而四…...


