![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
搜索算法(DFS、BFS、棋盘问题)
搜索
曼切斯特的流氓
007
展开
-
拯救大兵瑞恩AcWing(bfs最短路+坐标编号化+dp状态转移)
分析dp部分:这道题对最短路中d数组进行变化,将它的含义变为编号z它目前拥有钥匙数为s,s是一个二进制数eg s=1010即z编号位置拥有钥匙1和钥匙3,那么我们跑一遍bfs先达n*m终点编号的一定是最短路。对于移动的处理,首先遇见墙肯定不能走,遇见门,我们要用手里的钥匙去匹配也就是((s>>x)&1)==1,门的类型为x,如果等于1那么有这把钥匙,如果等于0那么没有这把钥匙,有这把钥匙正常通过,没有这把钥匙不能通过,其他的与bfs最短路问题没有任何差别。首先要学会横纵坐标转编号。原创 2023-05-12 17:55:11 · 118 阅读 · 0 评论 -
送礼AcWing(双向dfs)
双向dfs,实际上就是两次dfs,根据这道题的规模,重量为2的31次幂想要做01背包肯定超时,但是这道题n的范围非常小所以利用dfs做,但是单纯的dfs规模也要有46的46次幂,我们将其分为两次dfs第一次dfs枚举前23种组合出的重量存到一个数组中记录下来,后23种在进行dfs,配合前面的数组得出最终的答案。优化:我们在第二次dfs时要记录答案,我们要在前面的重量数组中找到一个合适的重量,然后使得这次深搜的结果加上当前重量小于等于最大值W,我们此时可以利用二分去寻找。原创 2023-05-06 20:26:25 · 86 阅读 · 0 评论 -
加成序列(迭代加深)
一直向下搜会造成dfs深度过于离谱,导致超时,如果对深度进行控制,那么他的答案很可能就在深度比较浅的位置。剪枝优化:每次在枚举xi+xj可能重复,所以利用一个vis数组进行去重,减少搜索次数。题目分析:x序列依次递增,xi=xj+xk ,x1=1,xm=n。这种就会造成超时,深度过深才能得到结果(沿着虚线dfs)原创 2023-05-06 16:05:47 · 74 阅读 · 0 评论 -
木棒AcWing167(DFS+剪枝)
仔细想一想dfs特点,比如棋盘问题,当从某个点向下dfs时这个点肯定会把所有的结果返回,如果这个点得不到想要的结果,那么你从其他点在经过这个点在继续搜,肯定结果都是相同的。首先对搜索顺序进行优化,想一想,我们在拼凑一根完整的木棒时,先放一根大的木棒在搭配几根小的木棒,这样dfs去搜的方案数少还是先放几根小木棒所搜得的方案少呢?答案肯定是先放大的木棒搜得的方案少,因为当我确定一个大的长度后,后面搭配的余量就比较少,能选择的方案也少。如果当前木棒放在开头返回结果失败,那么这个枚举的length肯定失败。原创 2023-05-06 13:58:29 · 130 阅读 · 1 评论 -
分成互质组(DFS搜索顺序)
这个顺序选择为,每次一个数要么加入之前的组,要么新成立一个组,按照这个顺序就可以得出每个数位于不同的组,不同组合,利用ans记录最小就可以得出答案。我们要确定一个搜索顺序,这个搜索顺序要将所有的数归类,归为不同的互质组里。原创 2023-05-05 15:43:43 · 83 阅读 · 0 评论 -
DFS搜索顺序
我们可以记录一个cnt变量表示已经遍历了点的个数,如果cnt==n*m那么表示所有点都已经遍历过了可以结束遍历。询问马走完全局有多少可行方案,那么也就dfs搜索形成的搜索树有多少分支可行。因为我每个分支判断完我仍然需要继续判断下一个分支所以需要回溯。利用一个g二维数组预处理一下两个字符串之间能否拼接。那么搜索终点判断条件是什么呢?原创 2023-05-05 12:35:01 · 74 阅读 · 0 评论 -
迷宫ACWing(dfs不需要回溯)
dfs不需要回溯,因为你搜过了证明这个方向是否可行结果就的出来了,那么你回溯的话会造成一直死在里面不出来,一直打圈在里面。原创 2023-05-05 09:38:39 · 170 阅读 · 0 评论 -
字串变换(双向bfs)
在做这种题头脑中能根据变化规则构建一副变化图,寻找图的最短路,求最短路根据bfs,然后我们优化bfs为双向bfs。原创 2023-04-25 12:32:25 · 46 阅读 · 0 评论 -
BFS计数问题(本质还是bfs最短路)
那么总有一个点是最终答案想要的状态,所以我们在这个图上跑最短路,这个最短路利用bfs来跑,bfs先遍历到的点,一定是这个点的最短路,利用这个性质,跑这个图。这道题操作比较复杂,我们还需要找到他的路径,所以利用一个pre的map来记录路径,记录每一个怎么转移的。每次可以有三种操作A、B、C那么一个点都进行这3中操作,会形成一张图。原创 2023-04-23 21:07:43 · 63 阅读 · 0 评论 -
挑选(全排列不回头情况)
dfs做法,不用回溯,如果回溯了会造成结果重复。原创 2023-04-23 14:11:57 · 31 阅读 · 0 评论 -
多源BFS(模板)
我们利用bfs先遍历到的点一定最短这个性质,建立超级源点,将所有的1入队,那么这些1会先进行bfs遇见0,那么这个0一定是最先看见当前的1,只需要更新一下距离即可。可以发现哪个公式就是距离最近的1的距离。原创 2023-04-18 19:24:30 · 92 阅读 · 0 评论 -
利用BFS最先遍历求最短路问题
bfs先到的点一定是最短的,因为他是向外扩散,每一层每一层的扩散,和dfs本质区别。原创 2023-04-18 18:26:15 · 176 阅读 · 0 评论 -
搜索(BFS,DFS)Flood Fill算法
西北东南其实就是二进制向右移动0,1,2,3。bfs求出连通块数量,以及统计出每块大小。在bfs时要把邻居也纳入进来检查判断。每次要判断当前坐标下哪个方向没有墙。原创 2023-04-18 16:12:02 · 32 阅读 · 0 评论 -
最大数字(dfs+回溯)
既然两种操作一个是加1一个是减1,那么dfs时 分别dfs两种操作,最后存储到res数组中,最后再将结果进行排序比较即可。sort对vector排序 sort(s.begin(),s.end(),cmp)tips:int转char 数字+‘0’ char转int char+‘0’string 类型可以用push_back添加str[i]原创 2023-03-22 03:46:06 · 102 阅读 · 0 评论 -
四分树(刘汝佳-紫书)
题目:题目链接如图所示,可以用四分图来表示一个黑白图像,方法是用根节点表示整幅图像,然后把行列个分成两等份,按图中的方式编号,从左到右对应4个子节点。如果某子节点对应的区域全黑或全白,则直接用一个黑节点或白节点表示;如既有黑又有白,则用一个灰节点表示,并且为这个区域递归建树。 给出两棵四分树的先序遍历,求二者合并(黑色部分合并)黑像素的个数(每幅图都是32X32的)。p表示灰节点,f表示黑节点,e表示白节点。样例输入:3ppeeefpffeefepefepeefepeeefpeefep原创 2021-04-01 22:06:21 · 374 阅读 · 0 评论 -
移动玩具(DFS、BFS)
题目:移动玩具洛谷题目解题思路:先利用bfs找出每一个起始玩具,到所有终点玩具所需移动步长求出。存放到dis数组中在利用dfs和"全排列"思想类似,一个萝卜一个坑,找出所有搭配情况。不懂全排列dfs做法的同学点超链接全排列细枝末节:需要将起始玩具和终点的玩具位置进行编号。如果起始玩具和终点玩具位置相同我们可以直接抹掉,不用考虑!代码实现:(里面全是细节~~~)#include <bits/stdc++.h>using namespace std;int one[原创 2021-03-30 11:50:13 · 342 阅读 · 0 评论 -
全排列(DFS)
题目:全排列题意分析:给出大小为n的数字,输出1~n的全排列,不允许重复数字eg: 123 132 213 231 321 312(n=3)解题思路:首先讲解DFS,所谓dfs就是深度优先遍历,简单来说"一条路走到黑,不撞南墙不回头",当到达最深处时,然后返回,上一层即里深处最近的一层,从上一层继续深度遍历,以此类推!回溯标记:在dfs时我们需要标记,已经用过的数字,保证数字不重复!当用过后我们还要取消标记!我想大部分的人都晕掉了!我把这道题的状态树画出来!大家就一目了然。原创 2021-03-28 20:55:15 · 601 阅读 · 4 评论 -
棋盘问题大全(DFS)
第一题:大家看完这两道题应该对棋盘问题有了一定认识,并且对dfs有了更加深刻的认识!耐心看完,我写的十分详细。题目:不爱看题目这里有链接在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放 k 个棋子的所有可行的摆放方案数目 C。输入格式输入含有多组测试数据。每组数据的第一行是两个正整数 n,k,用一个空格隔开,表示了将在一个 n∗n 的矩阵内描述棋盘,以及摆放棋子的数目。当为原创 2021-03-29 18:10:32 · 2903 阅读 · 2 评论