当前位置: 首页 > article >正文

GESP6级C++考试语法知识(二十五、深度优先搜索(五、DFS终极奥义))

⚔️第五课《DFS终极奥义》——原来算法世界到处都是 DFS一、故事开始算法圣殿1、经过前四课。小骑士 DFS 已经成为了DFS 小勇者2、但是。算法王国最深处。还有一座“dfs算法圣殿”3、dfs算法圣殿有迷宫是 DFS全排列是 DFS岛屿问题是 DFS八皇后也是 DFS数独也是 DFS4、小骑士震惊“为什么这么多问题 居然全都是 DFS”5、今天。我们就要真正理解DFS 的终极奥义二、DFS 的真正本质是什么1、很多同学以为DFS 是dfs(...)这个函数。其实不是。2、DFS 真正本质“尝试所有可能”3、只要问题满足当前状态 ↓ 可以做选择 ↓ 进入下一状态那么很可能就是 DFS4、DFS 万能思维模板① 当前状态是什么② 下一步有哪些选择③ 做一个选择④ 进入下一层⑤ 回来恢复现场这就是所有 DFS 的共同灵魂⚔️第一部分《迷宫为什么是 DFS》1、迷宫问题例如S . . # # . . . E2、DFS 在做什么1当前位置(x,y)2下一步选择上 下 左 右3于是尝试一种方向 ↓ 继续搜索 ↓ 走不通回来 ↓ 换方向4这就是 DFS3、迷宫 DFS 最核心代码for(int i 0; i 4; i) { int nx x dx[i]; int ny y dy[i]; dfs(nx,ny); }4、本质“试每一种走法”5、参考代码#include iostream using namespace std; int maze[10][10] { {0,0,0,1}, {1,1,0,1}, {0,0,0,0} }; bool vis[10][10]; int n 3; int m 4; bool success false; // 四个方向 int dx[4] {1,-1,0,0}; int dy[4] {0,0,1,-1}; void dfs(int x,int y) { // 出界 if(x 0 || x n || y 0 || y m) return; // 墙 或 已访问 if(maze[x][y] 1 || vis[x][y]) return; // 到达终点 if(x 2 y 3) { success true; return; } vis[x][y] true; // 四方向搜索 for(int i 0; i 4; i) { int nx x dx[i]; int ny y dy[i]; dfs(nx,ny); } } int main() { dfs(0,0); if(success) cout 能到终点; else cout 不能到终点; return 0; }⚔️第二部分《全排列为什么是 DFS》1、问题1 2 3组成所有排列。2、DFS 在做什么当前位置当前已经选了哪些数字例如[1,2]3、下一步选择还能选哪个数字例如34、于是选一个数字 ↓ 继续搜索 ↓ 回来 ↓ 撤销选择5、这也是 DFS6、经典代码for(int i 1; i n; i) { if(vis[i]) continue; path.push_back(i); vis[i] true; dfs(); vis[i] false; path.pop_back(); }7、真正本质“尝试每一种排列可能”8、参考代码#include iostream #include vector using namespace std; vectorint path; bool vis[10]; int n 3; void dfs() { // 已经选满 if(path.size() n) { for(int i 0; i path.size(); i) cout path[i]; cout endl; return; } // 尝试每个数字 for(int i 1; i n; i) { // 已使用 if(vis[i]) continue; // 做选择 path.push_back(i); vis[i] true; // 搜索下一层 dfs(); // 恢复现场 vis[i] false; path.pop_back(); } } int main() { dfs(); return 0; }⚔️第三部分《岛屿问题为什么是 DFS》1、问题1 1 0 1 0 1 0 0 1统计岛屿数量。2、DFS 在干什么找到一个陆地↓把整个岛全部搜出来3、本质不断扩散 ↓ 不断搜索邻居4、代码核心dfs(nx,ny);不断搜周围。5、这里 DFS 像什么像病毒扩散或者颜料染色这类问题叫连通块问题6、参考代码#include iostream using namespace std; int a[10][10] { {1,1,0,0}, {1,0,0,1}, {0,0,1,1}, {0,0,0,0} }; bool vis[10][10]; int n 4; int m 4; int dx[4] {1,-1,0,0}; int dy[4] {0,0,1,-1}; void dfs(int x,int y) { // 出界 if(x 0 || x n || y 0 || y m) return; // 海洋 或 已访问 if(a[x][y] 0 || vis[x][y]) return; vis[x][y] true; // 搜索四周 for(int i 0; i 4; i) { int nx x dx[i]; int ny y dy[i]; dfs(nx,ny); } } int main() { int cnt 0; for(int i 0; i n; i) { for(int j 0; j m; j) { // 找到新岛屿 if(a[i][j] 1 !vis[i][j]) { dfs(i,j); cnt; } } } cout 岛屿数量 cnt; return 0; }⚔️第四部分《八皇后为什么是 DFS》1、八皇后问题在棋盘放8个皇后要求互相不能攻击2、皇后攻击规则不能同行同列同斜线3、DFS 在做什么1当前状态已经放了哪些皇后。2下一步选择下一行放哪里3于是尝试一个位置 ↓ 继续放下一个皇后 ↓ 冲突则回来 ↓ 换位置4这其实就是“高级版全排列”4、八皇后简化版void dfs(int row) { if(row 8) { ans; return; } for(int col 0; col 8; col) { if(能放) { 放皇后; dfs(row 1); 移除皇后; } } }5、真正本质“尝试每一种摆放方案”6、参考代码#include iostream #include cmath using namespace std; int pos[10]; int n 8; int ans 0; // 检查当前位置能不能放皇后 bool check(int row,int col) { // 检查前面已经放过的皇后 for(int i 0; i row; i) { // 同列 if(pos[i] col) return false; // 同斜线 if(abs(i - row) abs(pos[i] - col)) return false; } return true; } // DFS搜索 void dfs(int row) { // 已经放完8行 if(row n) { ans; cout 第 ans 种方案 endl; // 输出棋盘 for(int i 0; i n; i) { for(int j 0; j n; j) { if(pos[i] j) cout Q ; else cout . ; } cout endl; } cout endl; return; } // 尝试这一行的每一列 for(int col 0; col n; col) { // 能放 if(check(row,col)) { // 放皇后 pos[row] col; // 搜索下一行 dfs(row 1); // 不需要手动恢复 // 因为 pos[row] 下一次会被覆盖 } } } int main() { dfs(0); cout 总方案数 ans endl; return 0; }⚔️第五部分《数独为什么也是 DFS》1、数独问题填数字1~9要求每行不重复每列不重复每宫不重复2、DFS 在做什么1当前状态已经填了哪些格子。2下一步选择当前空格填什么数字3于是尝试填1 ↓ 不行 ↓ 回来 ↓ 尝试填2 ↓ 继续搜索4这就是回溯 DFS3、数独代码思想简化for(int num 1; num 9; num) { if(能填) { 填数字; dfs(下一个空格); 擦掉数字; } }4、真正本质“尝试所有填法”5、参考代码#include iostream using namespace std; int a[4][4] { {1,0,0,4}, {0,0,1,0}, {0,1,0,0}, {2,0,0,3} }; bool check(int x,int y,int num) { // 检查行 for(int i 0; i 4; i) { if(a[x][i] num) return false; } // 检查列 for(int i 0; i 4; i) { if(a[i][y] num) return false; } return true; } bool dfs(int x,int y) { // 下一行 if(y 4) { x; y 0; } // 完成 if(x 4) return true; // 已经有数字 if(a[x][y] ! 0) return dfs(x,y1); // 尝试填数字 for(int num 1; num 4; num) { if(check(x,y,num)) { a[x][y] num; if(dfs(x,y1)) return true; // 恢复现场 a[x][y] 0; } } return false; } int main() { dfs(0,0); for(int i 0; i 4; i) { for(int j 0; j 4; j) cout a[i][j] ; cout endl; } return 0; }三、同学们突然发现1、原来这些题虽然长得不一样。但本质完全一样2、迷宫尝试走法3、排列尝试顺序4、岛屿尝试扩散5、八皇后尝试摆放6、数独尝试填数7、本质全都是做选择 ↓ 进入下一层 ↓ 搜索 ↓ 回来 ↓ 恢复现场四、DFS 真正强大的地方1、DFS 的威力在于“暴力尝试所有可能”2、很多超级难题。其实本质都是搜索3、例如AI 搜索游戏走法自动解谜棋类程序路径规划很多都和 DFS 有关系。五、DFS 最终万能模板1、同学们最终形成“DFS 思维模板”第一步当前状态是什么第二步有哪些选择第三步尝试一个选择。第四步进入下一层。第五步回来恢复现场。2、最终模板void dfs(当前状态) { if(结束条件) { 处理答案; return; } for(每一种选择) { if(合法) { 做选择; dfs(下一状态); 恢复现场; } } }六、本章总结1、DFS 不是一个代码模板。2、DFS 真正是“搜索所有可能性”的思想3、只要问题满足能做选择 ↓ 能进入下一步 ↓ 需要尝试所有可能4、那么它很可能就是 DFS七、真正学懂 DFS 的同学1、最后会达到一种境界看到题目时。脑子里会自动出现搜索树2、并且自动思考当前状态是什么 下一步能做什么 是否需要回溯3、这时。同学们就真正掌握 DFS 了

相关文章:

GESP6级C++考试语法知识(二十五、深度优先搜索(五、DFS终极奥义))

⚔️第五课《DFS终极奥义》——原来算法世界到处都是 DFS!🌟一、故事开始:算法圣殿1、经过前四课。小骑士 DFS 已经成为了:🌟DFS 小勇者!2、但是。算法王国最深处。还有一座:🌟“dfs…...

职教高考及高职分类招生控制线 API 接口

职教高考及高职分类招生控制线 API 接口 接口详情官网地址: https://www.gugudata.com/api/details/vocationalcontrollines 职教高考及高职分类招生控制线 API 支持查询职教高考及高职分类招生控制线数据,覆盖年份、省份、招生类别、考生类型、录取批次和科类等筛…...

写给前端的 CANN-ops-rand:昇腾随机数生成算子库到底是啥?

之前做强化学习,兄弟问我:“哥,我想在昇腾上做蒙特卡洛模拟,随机数生成有现成的库吗?” 好问题。今天一次说清楚。 ops-rand 是啥? ops-rand Operations for Random,昇腾随机数生成算子库。 一…...

【CDA干货】用这4种数据分析思维,拆解爆款视频密码

很多做视频的人,发视频全凭感觉。今天视频火了,不知道为什么;明天流量掉了,也不知道哪里出了问题。其实,爆款背后从来不是运气,而是数据的逻辑。用数据分析思维做视频账号,就是把那些说不清道不…...

对比直接购买,使用Taotoken的Token Plan套餐如何节省API成本

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 对比直接购买,使用Taotoken的Token Plan套餐如何节省API成本 1. 成本管理中的常见挑战 对于需要持续调用大模型API的开…...

web服务器的实验(RHCE)

web服务器的实验(RHCE) 实验目录 ​ 实验1:快速搭建一个网站 ​ 实验2:替换网页目录 ​ 实验3:搭建网站使用内网穿透 ​ 实验4:搭建密码验证功能来访问网站数据 ​ 实验5:新建文件目录列表的网站…...

Louvain 算法:让网络自己“报团取暖”的发现者

🧩 Louvain 算法:让网络自己“报团取暖”的发现者为什么你的朋友圈会自然分成老同学、同事和游戏好友?Louvain算法就是网路世界里的“社交侦探”,它能自动帮你看清整个网络中“谁和谁是一伙的”。一、从一个生活场景说起 &#x1…...

Karpathy投奔Anthropic:一个顶级AI天才的四次人生豪赌

5月19日,一条推文炸了整个AI圈。 Andrej Karpathy——OpenAI联合创始人、前特斯拉AI总监、AI教育布道师——宣布加入Anthropic。 英伟达具身智能负责人Jim Fan评论说:"这比Google I/O的Keynote更重磅。" 网友打了个比方:"堪…...

一次性掌握Mapbox地图开发框架

又到一年毕业季,春招已经基本结束,选择不考研直接就业的同学,如果5月还没拿到offer,接下来只能等暑期实习岗位,再晚一点就只能等秋招了。想找WebGIS相关的岗位,可以通过各种企业官方招聘网站、大众招聘平台…...

用强化学习训练 Agent:从随机尝试到精通复杂任务

用强化学习训练 Agent:从随机尝试到精通复杂任务 副标题: 深度解析马尔可夫决策过程、Q学习、DQN、PPO四大核心支柱,附从OpenAI Gym经典项目实战与Atari Pong完整训练代码 第一部分:引言与基础 (Introduction & Foundation) 1…...

LeagueAkari:5个智能功能提升你的英雄联盟游戏体验

LeagueAkari:5个智能功能提升你的英雄联盟游戏体验 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 还在为英雄联盟繁琐的客户端操作…...

数字化舆论管控新时代,搜极星赋能企业长效发展

数字化舆论已从传统社交平台、媒体渠道,全面延伸至 AI 大模型对话场景。AI 幻觉、虚假信息扩散、恶意信息投毒、跨平台舆论失控,正成为企业声誉管理的全新挑战。 传统人工排查、被动应对、局部监测的舆论管控模式彻底失效,企业亟需一套全域覆…...

如何快速下载并配置Taotoken的CLI工具实现一键接入

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 如何快速下载并配置Taotoken的CLI工具实现一键接入 对于需要统一团队开发环境的开发者而言,手动为每个项目、每位成员配…...

YOLOv8 ROS 2深度解析:机器人视觉感知系统的架构设计与实践指南

YOLOv8 ROS 2深度解析:机器人视觉感知系统的架构设计与实践指南 【免费下载链接】yolov8_ros Ultralytics YOLOv8, YOLOv9, YOLOv10, YOLOv11, YOLOv12 for ROS 2 项目地址: https://gitcode.com/gh_mirrors/yo/yolov8_ros 在机器人技术快速发展的今天&#…...

面试:怎么设计客服 Agent对话状态机的?

面试:怎么设计客服 Agent对话状态机的? 这个问题问得好,我结合我们当时的设计思路具体讲讲。 对话状态机的核心设计思路 客服场景的状态机和其他业务系统不太一样——它既要处理业务状态(订单走到哪一步了),又要处理对话状态(用户在哪个节点、槽位填了多少),还得处理…...

ANI-RSS界面美化终极指南:5个技巧打造专属追番体验

ANI-RSS界面美化终极指南:5个技巧打造专属追番体验 【免费下载链接】ani-rss 基于RSS自动追番、订阅、下载、刮削、洗版 项目地址: https://gitcode.com/gh_mirrors/an/ani-rss 你是否厌倦了千篇一律的软件界面?想要让你的追番工具拥有独一无二的…...

Cursor Pro激活工具深度解析:机器ID重置与多账户管理的技术实现

Cursor Pro激活工具深度解析:机器ID重置与多账户管理的技术实现 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached…...

中小型企业服务器常见隐患 + 标准化运维维护方案总结

做运维多年,接触过大量中小企业服务器,总结几个最常见、最致命的问题:1、服务器常年不关机、不巡检,磁盘爆满无人察觉;2、对外开放端口过多,没有安全策略,极易被暴力破解;3、数据库无…...

为openclaw配置taotoken作为其ai供应商的详细步骤指南

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 为OpenClaw配置Taotoken作为其AI供应商的详细步骤指南 OpenClaw是一款流行的AI智能体开发工具,它允许开发者通过配置来…...

毕业答辩 PPT 救星!okbiye AI PPT 如何让学术演示稿制作效率提升 10 倍?

okbiye-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AI PPTAI PPT制作 - Okbiye智能写作https://www.okbiye.com/ppt 毕业季的深夜,多少人对着空白 PPT 文档陷入崩溃:找模板、排大纲、调格式,光是基础框架就要耗上两三天&…...

终极指南:3分钟搞定Windows iPhone网络共享驱动一键安装

终极指南:3分钟搞定Windows iPhone网络共享驱动一键安装 【免费下载链接】Apple-Mobile-Drivers-Installer Powershell script to easily install Apple USB and Mobile Device Ethernet (USB Tethering) drivers on Windows! 项目地址: https://gitcode.com/gh_m…...

【IEEE冠名】第七届IEEE人工智能与机电自动化国际学术会议(IEEE-AIEA 2026)

第七届人工智能与机电自动化国际学术会议(AIEA 2026)致力于将“人工智能”与“机电自动化”领域的专家学者、研发者和技术人员汇集一堂的国际盛会。会议将于2026年6月26-28日在中国深圳举行。会议的主旨是为相关领域的从业者及研究人员提供一个开放、共享…...

2026 年 5 月消防刷题不提分?高质量刷题工具实测指南

2026 年消防设施操作员考试侧重实操应用与智慧消防,题型灵活性大幅提升,超 68% 考生面临刷题量大但分数停滞的困境。核心痛点集中在:消防设施操作员模拟题质量差、与真题命题逻辑不符(相似度低于 62%)、消防设施操作员…...

边际效应在数据分析中的应用

边际效应是一个源于经济学但广泛应用与数据分析、产品运营、策略优化的核心概念。简单来说,他指的是每增加一个单位的投入(如资源、功能、用户、广告话费),所带来的额外产出(如收入、活跃度、用户数)。理解…...

视频号视频下载去水印方法全是坑?全网视频一键拿捏!2026封神玩法!

日常视频号视频,遇到优质内容总想留存下来,不管是日常收藏翻阅,还是剪辑创作取用都十分合适。可现如今各大平台管控严格,直接保存功能尽数受限,自带水印遮挡画面观感,导出画质大打折扣。网上流传的各类存视…...

视频孪生融合落地,无感定位完胜 UWB 静态定位模式

视频孪生融合落地,无感定位完胜 UWB 静态定位模式数字孪生产业加速向实景化、动态化、实景融合方向纵深发展,视频孪生凭借实景画面与虚拟模型共生联动的特性,成为实体场景数字化治理的核心载体。空间定位作为视频孪生的数据根基,直…...

ESXi 9.0.0 HPE原厂定制版深度解析|专属硬件适配+零报错部署指南,HPE服务器运维最优解

随着vSphere 9.0虚拟化架构全面普及,企业HPE慧与服务器的底层虚拟化部署迎来全新升级需求。普通通用版ESXi镜像在HPE ProLiant、Apollo系列服务器中,常出现网卡不认、RAID驱动缺失、iLO管理异常、硬件兼容报错等问题,严重影响生产部署效率与系…...

DeepSeek多集群联邦治理难题破局:用GitOps+ArgoCD+自定义CRD实现跨AZ/AWS/GCP统一管控——现在不看,下季度升级将强制启用

更多请点击: https://kaifayun.com 第一章:DeepSeek云原生架构设计 DeepSeek云原生架构以Kubernetes为核心调度平台,深度融合服务网格(Istio)、可观测性栈(Prometheus Grafana Loki)与GitOps…...

【OpenClaw 进阶配置】如何让 MiniMax 搜索替代 SearXNG 作为 Web Search provider

【OpenClaw 进阶配置】如何让 MiniMax 搜索替代 SearXNG 作为 Web Search provider 标签: OpenClaw / MiniMax / 配置教程 / AI工具 踩坑记录 + 完整配置方案 前言 最近在配置 OpenClaw 的 web_search 工具,遇到了一个有意思的问题:明明已经在 tools.web.search.provider …...

专业的郑州苹果手机维修联系电话口碑佳的

在当今数字化时代,苹果手机已成为人们生活中不可或缺的一部分。然而,手机使用过程中难免会出现各种故障,这时候选择一家专业靠谱的维修店就显得尤为重要。在郑州,果速修凭借其卓越的服务和良好的口碑,成为众多苹果用户…...