
【BFS】
文章平均质量分 53
bfs
不牌不改
※ 接受自己很普通
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
L3-018 森森美图 (30 分)
题目题目链接题解BFS。先看看样例咋出来的吧。判断某个坐标属于起点终点连线的哪一侧的时候,我们采用是将点代入起点终点的两点式中根据正负值判断,两次bfs更新起点到终点的“距离”。bfs每次扩展一个点,用起点到该点的“距离”更新其八个方向上的点的“距离”,如果八个方向上的点保存的“距离”被更新了,则入队,可以用这些点继续更新别的点,否则不要入队了,因为别的点已经由这些点更新过了,再加入个没变的“距离”还是不会有任何效果的,所以直接不入队,节约时间。坑点:注意不要重复统计起点和终点。(这个原创 2022-04-19 20:41:08 · 1262 阅读 · 0 评论 -
蓝桥杯2019年第十届国赛真题-大胖子走迷宫
题目题目链接题解BFS。整体思路:将位置信息和时刻信息放入队列,根据时刻信息判断当前时刻小明的大小,如果大小为1×11×11×1则不能原地停留,因为没意义啊,停留是为了让自己的肚子减小,但是1×11×11×1时肚子已经最小了,所以只有当大小不是1×11×11×1时才会进行停留操作,对应到代码上就是位置信息不变,时刻信息+1入队;其他部分就是和基础BFS差不多了,遍历四个方向,如果挺着当前的肚子会遇到障碍,则continue;如果之前走到过该位置,则continue;如果肚子发生越界,则contin原创 2022-04-06 19:49:52 · 979 阅读 · 0 评论 -
蓝桥杯2018年第九届真题-迷宫与陷阱
题目题目链接题解BFS。主要的特殊点在于加了很多特殊的情况,逐一判断即可。注意vis/st标记数组是三维的第一维是行号,第二维是列号,第三维是能量值,表示是否以该能量值到达过该点。代码#include<bits/stdc++.h>using namespace std;const int N = 1100;int n, k, st[N*N][15];string a[N];int dir[2][4] = {-1, 1, 0, 0, 0, 0, -1, 1};str原创 2022-04-05 19:23:33 · 922 阅读 · 1 评论 -
2017年蓝桥杯省赛填空题- 跳蚱蜢
题目题目链接题解BFS(+STL)最少次数,每次跳跃对次数的贡献都是1,完全可以抽象理解为最短路,所以采用BFS可以直接算出最短长度。状态转移存在四种,以题中给的状态为例,可以选择2跳到空处、1跳到空处、7跳到空处或8跳到空处。标记一下遇到过的状态,不要再加入队列中了。代码#include<bits/stdc++.h>#define PIV pair <int, vector <int> >using namespace std;int ans原创 2022-03-28 11:45:41 · 270 阅读 · 1 评论 -
2018年蓝桥杯C/C++B组国赛-调手表
题目题目链接题解BFS。题目大意:假设当前的数是000,可以选择+k+k+k或+1+1+1再对nnn取模来改变当前的数,因为对nnn取模,所以当前的数总共可以变为0∼n−10\sim n-10∼n−1,求从000第一次变成这nnn个数所需要加的最多次数。也就是说000变成111需要加333次,000变成222需要加444次,那么答案就是较大的数444。一开始想的是递推(动态规划),但是感觉转移不了。如果顺序枚举每个数,那么转移方程应该表示为该数从+k+k+k转移过来或从+1+1+1转移过来,原创 2022-03-16 20:07:12 · 683 阅读 · 0 评论 -
2019年蓝桥杯省赛-迷宫
题目题目链接题解BFS。BFS模板,但是我做错了。我的做法是将到达终点的全部路径都加入到一个vector中,最后对vector排序,输出第一个字符串即可。但是这样做是错误的,准确的说是不一定对。正确的做法是对于每一个位置都按照“DLRU”的顺序遍历,因为DLRU的字典序最小,先遍历字典序小的方向,只要到达终点,那么一定就是字典序最小的路径。为什么我的做法不对呢?对于这个上下对称的两条道路而言,到达终点的总步数是相同的,要求字典序最小,那么肯定选下面的路径,因为下面的路径在两条路分叉的原创 2022-03-11 11:08:58 · 739 阅读 · 0 评论 -
蓝桥杯2015年第六届真题-穿越雷区
题目题目链接题解BFS模板题。就在模板题的基础上稍微加了点限制而已。我用的是pair存的,first表示位置,将二维压缩成一维了;second表示步数;要求正负交替,我就采用异或的思想进行,判断下一个位置能否作为落脚点即可。不懂如何实现的二维压缩成一维的同学,评论区问一下,我会回复。代码#include<bits/stdc++.h>using namespace std;typedef pair<int, int> PII;const int N = 1原创 2021-08-16 11:43:44 · 264 阅读 · 0 评论 -
蓝桥杯算法提高VIP-密码锁
题目题目链接题解BFS。按交换次数分层,让交换次数少的结点去扩展交换次数+1的新结点,每个结点需要保存的信息有一个字符串和得到这个字符串是经过了多少次交换。每获取到队头结点,先通过find("2012")函数判断是否存在"2012"子串,若存在答案就是得到此字符串的交换次数,若不存在,我们需要遍历字符串交换相邻俩位进行一次交换操作,判断得到的新字符串是否之前插入过队列中,若未插入过,则将新结点插入。标记字符串是否出现过用的是map;find返回值为-1表示没找到,否则返回子串所在的位置的地址。原创 2021-08-10 15:53:51 · 313 阅读 · 0 评论 -
[蓝桥杯][历届试题]九宫重排
题目题目链接题解BFS。先讲标准做法,对应代码2:用map类型的vis记录某个状态是否经历过;什么是状态,状态就是比如12345678.或123.46758,这些string型的数值就对应着一个个状态,即网格中数字和空格的不同排法。pair 知识点:队列中结点的类型为pair<string, int>,pair<string, int>相当于一个结构体里面有两个元素,一个是string类型,另一个是int类型,分别记录状态和到达此状态的步数。pair的第一个元素通过原创 2021-07-29 19:55:54 · 211 阅读 · 0 评论 -
CodeForces 986A Fair
题目大意题目链接每个城市都可以生产一种物品,要选择一个城市举办party,要求举办party的城市至少有s 种不同的商品,因此需要从其他城市将商品运送到举办party的城市。问若每个城市举办party运送的距离是多少?题解bfs+思维枚举每种商品,求出每个城市获取到每种商品的最短距离,对于每个城市而言,将每种商品按照获取所需最短距离从小到大排序,前s个距离之和即为此城市的最小花费(无需知道取的哪几种商品)—————————————看懂代码后再看下面:本质上,我们每次都是将生产某一种商品的城原创 2021-07-21 10:26:47 · 224 阅读 · 0 评论