做铝材什么什么网站好wordpress 静止ip访问
做铝材什么什么网站好,wordpress 静止ip访问,第一次打开wordpress白,wordpress sdk.js好卡文章目录DFSdfs是什么#xff1f;核心深度优先回溯标记已访问节点练习题BFS引入解释练习题优化引入剪枝方法记忆化搜索最优性剪枝可行性剪枝练习题DFS
dfs是什么#xff1f;
深度优先搜索算法#xff08;Depth First Search#xff0c;简称DFS#xff09;#xff0c;一…文章目录DFSdfs是什么核心深度优先回溯标记已访问节点练习题BFS引入解释练习题优化引入剪枝方法记忆化搜索最优性剪枝可行性剪枝练习题DFSdfs是什么深度优先搜索算法Depth First Search简称DFS一句话总结DFS 是一种“一条路走到黑撞墙再回头”的算法像极了玩迷宫游戏时的策略。核心目标遍历或搜索树、图中的所有可能路径。通俗比喻假设你被困在一个迷宫里入口是起点S出口是终点T路.可以走墙*不能走。DFS 的策略是遇到岔路时随便选一条路比如先右转。走到死胡同时原路返回到上一个岔路口换另一条路继续走。最终找到出口如果存在的话但可能绕远路。核心深度优先思想优先往深处探索直到无路可走。举例假设迷宫中有三条分叉路A→B→C死胡同、A→D→E→T出口。DFS 会先走 A→B→C发现是死胡同后回退到 A再走 A→D→E→T。回溯思想走到尽头后回退到上一个岔路口换另一条路继续探索。关键操作递归返回时恢复状态比如取消标记。举例在迷宫 A→B→C 中回退到 B 时需要将 C 标记为未访问否则后续路径无法重新探索 C。标记已访问节点思想记录走过的节点避免重复访问和死循环。关键操作用一个数组visitedvis记录是否访问过某个位置。举例在迷宫中如果从 A→B→A环路未标记会导致无限循环。标记后第二次访问 A 时会直接跳过。练习题表示上下左右的方向数组intdir[4][2]{{0,1},{0,-1},{-1,0},{1,0}};或intdx[4]{0,0,1,-1},dy[4]{1,-1,0,0};迷宫一#includebits/stdc.husingnamespacestd;constintN11;intn,m,vis[N][N];chara[N][N];constintdir[4][2]{{-1,0},{1,0},{0,1},{0,-1}};boolf;voiddfs(intx,inty){if(a[x][y]T){f1;return;}for(intk0;k4;k){intxxxdir[k][0];intyyydir[k][1];if(xx1xxnyy1yyma[xx][yy]!*!vis[xx][yy]){vis[xx][yy]1;dfs(xx,yy);}}}voidsolve(){cinnm;intx-1,y-1;for(inti1;in;i){for(intj1;jm;j){cina[i][j];if(a[i][j]S){xi,yj;}}}dfs(x,y);if(f){coutyes\n;}else{coutno\n;}}intmain(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);intT1;// cinT;while(T--)solve();return0;}BFS引入广度优先搜索算法Breadth First Search简称BFS通常指利用队列结构逐层扩展状态的搜索方式适合求解最短路径或最少步骤类问题。解释核心思想按层扩展从起点开始逐层扫描可到达的位置。首次遇到终点时的路径长度即为最短路径。这种方式保证了搜索的层次性与最优性。基本流程在实际执行中BFS 会从起点出发先访问起点的所有直接可到达结点这些可到达结点构成了搜索的第一层接着再以这些可到达结点为新的起点依次访问它们的邻居形成第二层以此类推不断向外扩展直至找到目标结点或遍历完所有可达结点。这个过程中算法会借助队列和访问数组vis将每一层新发现的结点访问数组中还没有记录过的依次入队确保同一层的结点按照访问顺序依次被处理从而严格遵循「按层扩展」的逻辑。复杂度O(n)练习题迷宫二#includebits/stdc.husingnamespacestd;constintN15;typedefpairint,intPII;intn,m,vis[N][N],dist[N][N];charg[N][N];constintdir[4][2]{{-1,0},{1,0},{0,1},{0,-1}};voidsolve(){cinnm;for(inti1;in;i){for(intj1;jm;j){dist[i][j]1e9;}}intx-1,y-1;for(inti1;in;i){for(intj1;jm;j){cing[i][j];if(g[i][j]S){xi,yj;}}}queuePIIq;q.push({x,y});vis[x][y]1;dist[x][y]0;while(!q.empty()){auto[x,y]q.front();q.pop();for(intk0;k4;k){intxxxdir[k][0];intyyydir[k][1];if(xx1xxnyy1yymg[xx][yy]!*!vis[xx][yy]){vis[xx][yy]1;dist[xx][yy]dist[x][y]1;q.push({xx,yy});}}}for(inti1;in;i){for(intj1;jm;j){if(g[i][j]T){cout(dist[i][j]1e9?-1:dist[i][j])\n;return;}}}}intmain(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);intT1;// cinT;while(T--)solve();return0;}优化引入DFS深度优先搜索是一种常见的算法大部分的题目都可以用 DFS 解决但是大部分情况下由于DFS复杂度比较高可以考虑使用一些实用的优化算法降低复杂度俗称剪枝。常见的深搜模板之后的模板将在此基础上进行修改。intans最坏情况,now;// now 为当前答案voiddfs(传入数值){if(到达目的地)ans从当前解与已有解中选最优;for(遍历所有可能性)if(可行){进行操作;dfs(缩小规模);撤回操作;}}其中的 ans 可以是解的记录那么从当前解与已有解中选最优就变成了输出解。剪枝方法最常用的剪枝有三种记忆化搜索、最优性剪枝、可行性剪枝。记忆化搜索记忆化搜索是一种通过记录已经遍历过的状态的信息从而避免对同一状态重复遍历的搜索实现方式。因为记忆化搜索确保了每个状态只访问一次它也是一种常见的动态规划实现方式。在搜索中相同的传入值往往会带来相同的解那我们就可以用数组来记忆。模板intg[MAXN];// 定义记忆化数组intans最坏情况,now;voiddfs(传入数值){if(g[规模]!无效数值)return;// 或记录解视情况而定if(到达目的地)ans从当前解与已有解中选最优;// 输出解视情况而定for(遍历所有可能性)if(可行){进行操作;dfs(缩小规模);撤回操作;}}intmain(){memset(g,无效数值,sizeof(g));// 初始化记忆化数组}最优性剪枝在搜索中导致运行慢的原因还有一种就是在当前解已经比已有解差时仍然在搜索那么我们只需要判断一下当前解是否已经差于已有解。模板intans最坏情况,now;voiddfs(传入数值){if(now比ans的答案还要差)return;if(到达目的地)ans从当前解与已有解中选最优;for(遍历所有可能性)if(可行){进行操作;dfs(缩小规模);撤回操作;}}可行性剪枝在搜索过程中当前解已经不可用了还继续搜索下去也是运行慢的原因。intans最坏情况,now;voiddfs(传入数值){if(当前解已不可用)return;if(到达目的地)ans从当前解与已有解中选最优;for(遍历所有可能性)if(可行){进行操作;dfs(缩小规模);撤回操作;}}练习题Missile Defence System考虑可行性剪枝考虑可行性剪枝可以用贪心的思想。如果对于一个导弹我们有两个递增装置都能够拦截它那么基于贪心我们一定会选择目前高度最高的一个去拦截它因为低的那一个“更有潜力”如现在有两个递增装置第一个依次拦截了高度为 2 5 8 的三枚导弹第二个拦截了 6 7 的两枚导弹那么如果又来了一发高度为 9 的导弹那么用第一个拦截一定会比第二个更优。递减装置同理。考虑最优性剪枝当目前答案已经大于已知最优答案时直接回溯即可。#includebits/stdc.husingnamespacestd;constintN55;intn,ans,a[N];vectorintup,down;voiddfs(intnow){intxup.size(),ydown.size();if(xyans)return;if(nown){ansmin(ans,xy);return;}for(inti0;ix;i){if(a[now]up[i]){inttempup[i];up[i]a[now];dfs(now1);up[i]temp;break;}}if(!x||up[x-1]a[now]){up.push_back(a[now]);dfs(now1);up.pop_back();}for(inti0;iy;i){if(a[now]down[i]){inttempdown[i];down[i]a[now];dfs(now1);down[i]temp;break;}}if(!y||down[y-1]a[now]){down.push_back(a[now]);dfs(now1);down.pop_back();}}voidsolve(){while(cinnn){ans1e9;up.clear(),down.clear();for(inti1;in;i)cina[i];dfs(1);coutans\n;}}intmain(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);intT1;// cinT;while(T--)solve();return0;}