7.26dfs周测复盘
DFS周测三题题解复盘前言本次周测覆盖了 DFS/BFS 的五大核心模型题号题目模型核心特征1P2089 烤鸡排列型DFS每个位置有固定选择范围2P1036 选数组合型DFS不考虑顺序用start去重3Perket子集型DFS每个物品选/不选两分支4填涂颜色Flood Fill连通块标记内外判断5迷宫问题BFS预处理连通块编号O(1)查询第一部分P2089 烤鸡基本信息项目内容题目编号、来源P2089 洛谷 / 烤鸡训练层级B DFS基础知识版块DFS、排列枚举、回溯、剪枝解题前・关键信号识别维度分析目标、约束、底层结构目标10种调料每种选1~3克使总重量为 n输出所有方案约束n ≤ 10000底层结构每个位置有3种选择形成多分支搜索树。数据规模3^10 59049DFS枚举完全可行。候选算法和依据DFS 回溯依据每个位置有固定选择范围需要枚举所有方案。复杂度预判时间复杂度 O(3^10)空间复杂度 O(10)。解题后・外化复盘维度内容实现结构 / 核心思路第一步定义dfs(step, sum)step 表示当前处理第几种调料sum 表示当前总重量第二步若step 10检查sum n满足则记录方案第三步枚举 i 从 1 到 3path[step] i递归dfs(step1, sumi)。核心思想每个位置枚举所有可能取值递归填下一个位置。错因回溯1. 出口忘记写return导致继续执行2. 剪枝不足只判断sum n未考虑剩余调料的最小/最大贡献边界和易错点1. 出口必须return2. n 的范围是 [10, 30]超出直接输出 03. 剪枝条件sum (10-step) n和sum (10-step)*3 n4. path 数组保存当前方案递归返回后自动覆盖无需显式回溯。下次看到什么信号我应该想到这个方法看到「每个位置有多个固定选择 枚举所有方案」用排列型DFS。AC 完整代码#includeiostream#includevector#includestring#includealgorithmusingnamespacestd;intn;intpath[10];vectorvectorintplans;voiddfs(intstep,intsum){if(sumn)return;if(sum(10-step)n)return;if(sum(10-step)*3n)return;if(step10){if(sumn){plans.push_back(vectorint(path,path10));return;}}for(inti1;i3;i){path[step]i;dfs(step1,sumi);}}intmain(){cinn;if(n10||n30){cout0endl;return0;}dfs(0,0);coutplans.size()endl;for(autop:plans){for(inti0;i10;i){coutp[i] ;}coutendl;}return0;}第二部分P1036 选数基本信息项目内容题目编号、来源P1036 洛谷 / NOIP2002 普及组训练层级A DFS知识版块DFS、组合枚举、素数判断解题前・关键信号识别维度分析目标、约束、底层结构目标从 n 个数中选 k 个求和为素数的方案数约束n ≤ 20底层结构组合枚举顺序无关用 start 参数控制枚举起点。数据规模n ≤ 20组合数 C(20,10) 184756DFS 完全可行。候选算法和依据DFS 回溯依据选 k 个数求和顺序无关属于组合枚举。复杂度预判时间复杂度 O(C(n,k))空间复杂度 O(k)。解题后・外化复盘维度内容实现结构 / 核心思路第一步读入 n, k 和数组 a第二步定义dfs(step, start, sum)step 表示已选了几个数start 表示当前从哪个下标开始枚举sum 表示当前总和第三步若step k检查 sum 是否为素数若是则 ans第四步枚举 i 从 start 到 n递归dfs(step1, i1, suma[i])。核心思想组合不计顺序下一层从 i1 开始枚举避免重复。错因回溯1. 递归写成dfs(step1, start1, ...)而不是i12. 出口忘记return边界和易错点1. 组合用 start 参数不需要 visited2. 下一层递归传i1不是start13. 出口必须return。下次看到什么信号我应该想到这个方法看到「从 n 个数中选 k 个 顺序无关 判断条件」用组合DFS。AC 完整代码#includeiostreamusingnamespacestd;intn,k,ans;inta[25];boolisPrime(intx){if(x2)returnfalse;if(x2)returntrue;if(x%20)returnfalse;for(inti3;i*ix;i2){if(x%i0)returnfalse;}returntrue;}voiddfs(intstep,intstart,intsum){if(stepk){if(isPrime(sum))ans;return;}for(intistart;in;i){dfs(step1,i1,suma[i]);}}intmain(){cinnk;for(inti0;in;i){cina[i];}dfs(0,0,0);coutansendl;return0;}第三部分Perket基本信息项目内容题目编号、来源Perket训练层级B DFS进阶知识版块DFS、子集枚举、选/不选模型解题前・关键信号识别维度分析目标、约束、底层结构目标选择若干种食材使酸度乘积和苦度和的差的绝对值最小约束每个食材只有选/不选两种状态底层结构子集枚举每个物品两个分支。数据规模n≤102^n完全可行。候选算法和依据DFS回溯依据每个物品选/不选枚举所有子集。复杂度预判时间复杂度O(2^n)空间复杂度O(n)。解题后・外化复盘维度内容实现结构 / 核心思路第一步定义dfs(step, sour, bitter, choose)step表示当前处理第几个食材sour表示当前酸度乘积bitter表示当前苦度和choose表示是否至少选了一个第二步若stepn若choosetrue则更新答案第三步两个分支不选直接递归和选sour*a[step]bitterb[step]choosetrue。核心思想每个物品只有两种状态形成二叉搜索树。错因回溯1.忘记记录是否选择了至少一个食材导致空集合参与计算2.错误剪枝if(abs(sour-bitter)ans) return;因为后面加入食材可能降低差值3.酸度初始值设为0但酸度是乘积应设为1。边界和易错点1.酸度初始值为1乘积的单位元2.必须记录是否至少选了一个食材3.不能随意剪枝因为差值可能先增后减4.选和不选两个分支都要搜索。下次看到什么信号我应该想到这个方法看到「每个物品选/不选 求最优」用子集DFS。AC 完整代码#includeiostream#includecmathusingnamespacestd;intn;inta[15],b[15];intans1e9;voiddfs(intstep,intsour,intbitter,boolchoose){if(stepn){if(choose){ansmin(ans,abs(sour-bitter));}return;}// 分支1不选dfs(step1,sour,bitter,choose);// 分支2选dfs(step1,sour*a[step],bitterb[step],true);}intmain(){cinn;for(inti0;in;i){cina[i]b[i];}dfs(0,1,0,false);coutansendl;return0;}三题对比总结对比维度P2089 烤鸡P1036 选数Perket枚举类型排列型组合型子集型状态参数(step, sum)(step, start, sum)(step, sour, bitter, choose)下一层起点固定范围 1~3i1无只有选/不选是否需要 visited❌❌❌核心判断sum nisPrime(sum)min(abs(sour-bitter))典型信号每个位置固定选择n选k顺序无关每个物品选/不选第四部分填涂颜色Flood Fill基本信息项目内容题目编号、来源填涂颜色训练层级B 图搜索基础知识版块DFS、连通块、Flood Fill解题前・关键信号识别维度分析目标、约束、底层结构目标将被其他区域包围的0区域染色约束棋盘大小有限底层结构棋盘上的连通区域问题。数据规模n≤30DFS完全可行。候选算法和依据Flood Fill洪水填充依据能够连接到边界的0一定不是被包围的从边界开始标记所有外部0剩下的0就是内部区域。复杂度预判时间复杂度O(n²)空间复杂度O(n²)。解题后・外化复盘维度内容实现结构 / 核心思路第一步从所有边界上的0开始DFS或BFS标记所有外部0为已访问第二步遍历整个棋盘所有未被标记的0即为被包围的内部区域将其改为颜色2第三步输出修改后的棋盘。核心思想正难则反——不直接找内部0而是标记外部0剩下的就是内部0。错因回溯1.直接寻找内部0导致判断复杂2.忘记标记访问导致重复搜索3.从非边界位置开始搜索漏掉边界可达的外部0。边界和易错点1.必须从边界上的0开始DFS2.访问过的位置需要标记3.边界上的0永远属于外部4.DFS结束后恢复/修改状态。下次看到什么信号我应该想到这个方法看到「棋盘 区域 内外判断 连通」用Flood Fill。AC 完整代码#includeiostream#includevector#includeset#includecmath#includealgorithmusingnamespacestd;intn;intv[35][35];boolvis[35][35];intdx[]{-1,0,1,0};intdy[]{0,1,0,-1};voiddfs(intx,inty){if(xn||x0||yn||y0){return;}if(vis[x][y])return;if(v[x][y]!0)return;vis[x][y]true;for(inti0;i4;i){intnxxdx[i];intnyydy[i];dfs(nx,ny);}}intmain(){cinn;for(inti0;in;i){for(intj0;jn;j){cinv[i][j];}}for(inti0;in;i){dfs(i,0);dfs(i,n-1);}for(intj0;jn;j){dfs(0,j);dfs(n-1,j);}for(inti0;in;i){for(intj0;jn;j){if(v[i][j]0!vis[i][j]){cout2 ;}else{coutv[i][j] ;}}coutendl;}return0;第五部分迷宫问题BFS预处理基本信息项目内容题目编号、来源迷宫问题训练层级B BFS优化知识版块BFS、连通块、预处理解题前・关键信号识别维度分析目标、约束、底层结构目标多次询问某个位置所在连通区域大小约束查询次数可能非常大底层结构连通区域的大小是固定的只需预处理一次。数据规模n≤1000询问次数可能达1e5。候选算法和依据BFS/DFS预处理 编号统计依据一次搜索处理所有连通区域后续查询O(1)。复杂度预判预处理O(n²)每次查询O(1)。解题后・外化复盘维度内容实现结构 / 核心思路第一步遍历所有格子若当前格子未编号且为可走格子进行BFS/DFS搜索第二步搜索过程中为所有可走格子分配相同编号第三步记录该编号对应的连通块大小第四步每次查询直接输出cnt[id[x][y]]。核心思想一次预处理所有连通区域避免每次查询重新搜索。错因回溯1.每次查询重新DFS时间复杂度太高2.BFS入队时忘记立即标记访问导致重复入队。边界和易错点1.x表示行y表示列2.BFS队列操作正确3.新加入节点必须立即标记访问否则可能重复入队4.数组大小要足够。下次看到什么信号我应该想到这个方法看到「大量询问 连通区域」用搜索预处理 编号统计。AC 完整代码#includeiostream#includevector#includequeue#includecmath#includealgorithmusingnamespacestd;intn,m;string v[1005];intid[1005][1005];intcnt[1000005];intdx[]{-1,0,1,0};intdy[]{0,1,0,-1};voidbfs(intsx,intsy,intnum){queuepairint,intq;q.push({sx,sy});id[sx][sy]num;intsize0;while(!q.empty()){auto[x,y]q.front();q.pop();size;for(inti0;i4;i){intnxxdx[i];intnyydy[i];if(nx0||nxn||ny0||nyn)continue;if(id[nx][ny])continue;if(v[x][y]v[nx][ny])continue;id[nx][ny]num;q.push({nx,ny});}}cnt[num]size;}intmain(){cinnm;for(inti0;in;i){cinv[i];}intnum0;for(inti0;in;i){for(intj0;jn;j){if(id[i][j]0){num;bfs(i,j,num);}}}while(m--){intx,y;cinxy;x--;y--;coutcnt[id[x][y]]endl;}return0;}

相关新闻

WarcraftHelper:魔兽争霸III终极优化插件,让经典游戏焕发新生

WarcraftHelper:魔兽争霸III终极优化插件,让经典游戏焕发新生

WarcraftHelper:魔兽争霸III终极优化插件,让经典游戏焕发新生 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper WarcraftHelper是…

2026/9/24 8:02:39 阅读更多 →
抖音无水印下载神器:douyin-downloader 完整使用指南,告别水印烦恼!

抖音无水印下载神器:douyin-downloader 完整使用指南,告别水印烦恼!

抖音无水印下载神器:douyin-downloader 完整使用指南,告别水印烦恼! 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite dedupl…

2026/9/25 13:14:57 阅读更多 →
你的C盘空间去哪了?DriverStore Explorer帮你找回被隐藏的20GB

你的C盘空间去哪了?DriverStore Explorer帮你找回被隐藏的20GB

你的C盘空间去哪了?DriverStore Explorer帮你找回被隐藏的20GB 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 你是否经常发现Windows系统C盘空间莫名其妙地减少&#xff1f…

2026/9/24 12:22:07 阅读更多 →

最新新闻

AIGC全栈落地实战:大模型、向量数据库与云渲染的算力延迟破局

AIGC全栈落地实战:大模型、向量数据库与云渲染的算力延迟破局

1. 从"能跑通"到"跑得稳":AIGC落地真正的分水岭 大模型这个词这两年已经被说烂了,但真正在一线做过AIGC项目交付的人心里都清楚,模型能不能出结果只是入场券,能不能在真实业务里稳定、低延迟、可计量地跑起来…

2026/9/26 8:52:37 阅读更多 →
Windows下MinGW编译PCL全流程:从依赖库到Qt点云可视化

Windows下MinGW编译PCL全流程:从依赖库到Qt点云可视化

简介:基于Qt的MinGW编译点云库及其全部依赖库的完整资源包,面向在Windows环境下使用MinGW工具链从事三维点云开发的C工程师。资源解决了PCL在Qt环境中编译时依赖库难以配齐的问题,提供了Boost、Eigen、FLANN、Qhull、VTK等底层库的头文件与编…

2026/9/26 8:52:37 阅读更多 →
SVG图标实战指南:从选型、压缩到版权与兼容性避坑

SVG图标实战指南:从选型、压缩到版权与兼容性避坑

1. 为什么现在还在用PNG做图标?SVG才是现代UI的底层基建你有没有遇到过这样的情况:在给一个响应式网站加图标时,设计师扔过来一套PNG,结果在Retina屏上糊成一片;或者想改个颜色,得重新切图、换资源、清缓存…

2026/9/26 8:52:37 阅读更多 →
大型制造企业MES建设方案:可落地的排产、追溯与缺陷闭环

大型制造企业MES建设方案:可落地的排产、追溯与缺陷闭环

简介:本资源是一份面向大型制造企业信息化建设者的MES(制造执行系统)全周期建设方案,聚焦生产计划排产、执行反馈、ERP集成及现场工控协同等核心场景,解决多系统集成难、排产灵活性不足、过程透明度低等典型痛点。文档…

2026/9/26 8:52:37 阅读更多 →
开源代码审查协议:策略即代码的AI协作范式

开源代码审查协议:策略即代码的AI协作范式

1. 这不是又一个“AI代码审查”玩具,而是一套可嵌入开发流程的开源协作协议 最近在几个技术社区里反复看到“open-code-review”这个词被拎出来讨论,不是作为某个商业产品的宣传话术,而是开发者在 Slack 频道里甩出的一行命令: o…

2026/9/26 8:52:37 阅读更多 →
Atlas 300V推理加速卡实战:从环境配置到YOLO模型部署全解析

Atlas 300V推理加速卡实战:从环境配置到YOLO模型部署全解析

先把结论放到最前面:Atlas 300V系列毫无疑问是运算加速卡,但它的"加速"和大多数人熟悉的GPU加速完全是两码事。我见过不少朋友把这张卡买回来,插上服务器,装好驱动,然后对着npu-smi里那一串输出发呆——接下…

2026/9/26 8:51:37 阅读更多 →

日新闻

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、…

2026/9/26 0:00:25 阅读更多 →
学校官网模拟全流程实践:从页面布局到后端接口与部署

学校官网模拟全流程实践:从页面布局到后端接口与部署

如果你正在找一门 Web 大作业的题目,或者刚开始接触 Web 前端开发想做点能拿来展示的东西,“学校官网模拟”几乎是最稳的选择。题目看着简单,但要把导航、新闻列表、轮播 Banner、二级页面、后台数据都串起来,其实已经把前端布局、…

2026/9/26 0:00:25 阅读更多 →
超级玛丽游戏源码C++:从零搭建横版跳跃游戏工程

超级玛丽游戏源码C++:从零搭建横版跳跃游戏工程

简介:这是一份面向游戏开发初学者与C进阶学习者的超级玛丽(超级马里奥)游戏源码,基于C面向对象编程实现,适合想通过经典项目理解游戏主循环、角色类设计、地图关卡加载与物理碰撞检测的读者参考。压缩包共49个文件&…

2026/9/26 0:00:25 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/25 19:27:14 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/25 11:15:26 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/25 20:29:09 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/25 20:29:43 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/25 20:29:31 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/25 19:27:26 阅读更多 →