![](https://img-blog.csdnimg.cn/20190927151053287.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法题目
文章平均质量分 65
各大OJ的一些算法题目
kaiserqzyue
高墙不应该阻止知识的传播
展开
-
算法题目题单+题解——图论
本文为自己做的一部分图论题目,作为题单列出,持续更新。。对于同一个一级标题下的题目,题目难度尽可能做到递增。原创 2024-02-04 21:22:03 · 687 阅读 · 0 评论 -
单元最短路模板 dijkstra以及SPFA的FAQ
两道题目都是求最小单元最短路。使用Dijkstra两道题目均可以通过,但是如果使用SPFA则只能通过。原创 2024-04-02 20:09:37 · 554 阅读 · 0 评论 -
LibreOJ 137. 最小瓶颈路(加强版) 题解 Kruscal重构树 ST表
上面结论的证明我们可以参考Krusca求解最小生成树的过程,对于当前可以加入的一条边(u, v, w),u和v之间的最小瓶颈路当前这条边,因为在之前的过程中经过权重比w小的边不能使u和v连通,根据这个过程我们便可以发现第一次让u和v相连的边的权重就是最小瓶颈路(这也是为什么Kruscal重构树可以求最小瓶颈路的原理),而不难发现这个值也就是u和v路径上的边权最大值。u和v两个结点之间最小瓶颈路指的是u和v的每条路径中经过的最大边权的最小值。的时候,每选择一条边的时候,我们创建一个新的结点。原创 2024-03-04 19:59:38 · 546 阅读 · 0 评论 -
LibreOJ 136. 最小瓶颈路 题解 最小生成树 倍增
给出结论:无向图的最小瓶颈路与其最小生成树上两个结点之间最小瓶颈路值相等。有了上述的结论,我们只需要求出最小生成树,然后通过树上倍增的方式,每次询问。之间的最小瓶颈路当前这条边,因为在之前的过程中经过权重比。给定一张无向图,询问两个结点之间的最小瓶颈路。求解最小生成树的过程,对于当前可以加入的一条边。相连的边的权重就是最小瓶颈路(这也是为什么。的每条路径中经过的最大边权的最小值。重构树可以求最小瓶颈路的原理)。两个结点之间最小瓶颈路指的是。上面结论的证明我们可以参考。路径上的最大值即可。原创 2024-03-01 17:24:03 · 221 阅读 · 0 评论 -
LuoguP2482 [SDOI2010] 猪国杀 题解 大型模拟题
当你发现如论如何也想不知道遗漏了什么之后,你可以将题解代码中的输出注释删除,其运行后会输出每一名角色进行的操作以及操作后的角色状态。一群猪玩猪国杀(类似三国杀),按照特定的规则出牌,问谁能获胜,输出获胜时,存活的猪的手牌。按照上面的思路实现,或者按照自己的思路实现,在实现的过程中注意提到的细节即可。注意到上面的点之后,我们便可以开始做题了。原创 2024-02-29 21:51:33 · 564 阅读 · 0 评论 -
Luogu P1515 旅行 题解 动态规划 DP
位置,你每次能够移动的距离区间。中最后一个点有多少中移动方案。轴非负半轴有一些点,点集记为。使用动态规划进行求解,定义。,每次移动到达的点必须在。原创 2024-02-22 20:51:15 · 187 阅读 · 0 评论 -
Luogu P6175 无向图的最小环问题 题解 Floyd
给定一张带权无向图,求出经过至少三个不同的点的最小环,环的大小由经过的边权和决定。之间是否存在边,如果不存在边则为无穷大,如果存在边则为边权,如果。对于一个最小环我们如果设其经过的编号最大的结点为。,上面的方程中第一维可以省略,也就变成了。算法中,我们定义的状态实际是。除起点与终点外不经过编号大于。,则不难发现至少存在两个结点。数组之前,计算出最大编号为。之间还存在一条不经过。原创 2024-02-21 20:05:24 · 312 阅读 · 0 评论 -
Luogu P4568 [JLOI2011] 飞行路线 题解 最短路 Dijkstra
只需要在求单源最短路的时候增加一个状态。给定一张带权无向图,以及起点。表示当前将几条边边权变成了。,通过将距离数组变成二维,,此时还有一种更新方式,即。,对于当前正在遍历的状态。设与其相连的一个结点为。则表明还可以将边变为。原创 2024-02-21 16:08:18 · 490 阅读 · 0 评论 -
Luogu P5905 【模板】全源最短路(Johnson) 题解 全源最短路 Johnson算法
其思想就是将一个含有负权边的图变成无负权边的图之后,跑。首先解释修改边权后一定不存在负边,在最短路中如果存在。,因此只需要在最后减去多加的一部分即可获得最终的最短路。这也就表明修改后的每条边权值均为正。给定一张有向图,求出任意两点之间的最短路。上述算法的时间复杂度为。之间的最短路依次经过。原创 2024-02-21 15:53:43 · 371 阅读 · 0 评论 -
Luogu P3547 [POI2013] CEN-Price List 题解 BFS 广度优先搜索
的边,可以通过前向星实现(建立双向链表)。的这条边更新过,后续通过这条边的距离一定会更大,因此不需要重复遍历。我们只需要求出上面三种情况的最短路取最小值即可。的边进行优化,最会只可能剩下一条或者零条边权为。对于情况三我们可以发现最多只会经过一条边权为。否则不会更优,那么既然这样,每有两条边权为。一定小于后遍历的点的距离,如果之前通过。的无向图,现在将所有两点之间最短路为。求得一次的单元最短路的结果记为。的边,则可以进行走一次边权为。的边,如果将原图的边权改为。的无向边,问到给定点。可以知道先遍历的点的。原创 2024-02-21 11:11:45 · 907 阅读 · 0 评论 -
Luogu P2860 [USACO06JAN] Redundant Paths G 题解 Tarjan 无向图缩点 边双连通
而对于环上的任意两个点,他们之间一定存在至少两条路径(顺时针与逆时针沿着环走)。首先我们考虑一个没有环且连通的无向图,这个时候这个无向图也就变成了一棵树。(若叶子结点个数为单数,需要将最后一个叶子结点与任意一个叶子结点相连接,如果只有一个叶子结点,那么将其与根节点相连即可)。的过程中我们走过一条边就要将其与反向边打上标记,不走反向边,其余的过程与有向图缩点一致。给定一张连通的无向图,问最少添加多少条无向边,使得任意两个点之间存在至少两条路径。综上,首先将所有的环缩成一个点,然后对新图中出度为。原创 2024-02-08 11:07:02 · 559 阅读 · 0 评论 -
Luogu P5058 [ZJOI2004] 嗅探器 题解 Tarjan 割点
不能进行通信,这说明强连通分量增加了)。我们只需要考虑哪些割点是满足条件的。一定不能是之前遍历过的点(如果是之前遍历过的点,那么删除。我们很容易发现要删除的点一定是割点(按照题意,删除后,如果不存在这样的点,输出。如果有多个这样的点,输出编号最小的。在这些新产生的联通分量中的某一个,那么。,你需要找到一个点(这个点不能是。均会产生一个新的强连通分量,如果。一定是成立的,因此只需要判断非。在这些联通分量中的一个也就是。给定一张无向图,以及两个点。明显是满足条件的(删除。,那么对于其所有满足。原创 2024-02-07 15:25:31 · 358 阅读 · 0 评论 -
POJ 2117 Electricity 题解 Tarjan 割点
表示有多少个子结点能够返回到当前结点或者当前结点之前遍历的结点,那么不难发现,删除当前结点后会增加的强连通分量的个数即为。经过上面的操作后,我们只需要对每个结点删除后增加的强连通分量个数取最大值与。表示有多少个子节点,不难发现删除根节点后增加的强连通分量个数为。给定一张无向图,问删除一个结点后最多会有多少个强连通分量。接下来我们只需要计算出删除每个割点会增加的强连通分量个数。表示初始的图中有多少个强连通分量,该值可以通过。对于一个强连通分量中的根节点而言,用。,对于一个强连通分量中的非根结点,用。原创 2024-02-07 14:53:25 · 548 阅读 · 0 评论 -
HDUOJ 4738 Caocao‘s Bridges 题解 桥 割边 Tarjan
题目也就是需要我们求一条桥边,这个桥边所拥有的边权最小。我们只需要求出所有的桥边,然后对边权取一个最小值即可(需要注意边权为。给定一个无向图,你可以选择最多删除一条边,删除边的代价是边的边权(特殊地,删除一条边权为。是否成立,不过需要注意的是由于可能存在重边,所以我们在搜索的时候不应该通过反向边更新。同时需要注意的是,对于一个本身就不连通的图,那么最小的花费是。),问最小代价使得图不连通。如果无论如何图都是连通的,那么则输出。之间的边是否是桥,我们只需要判断。的边我们要将其变成边权为。原创 2024-02-07 12:36:46 · 281 阅读 · 0 评论 -
POJ 1523 SPF题解 Tarjan 割点
如果当前遍历的结点存在一个子结点不能够回到已经遍历过的结点,那么当前遍历的结点便是一个割点(这样的依据是删除当前的结点后,这个不能回到遍历过的结点的子节点会变成一个新的强连通分量),如果我们记录。表示当前结点有多少个子结点不能够回到已经遍历过的结点,那么不难发现对于非根结点而言,如果当前的结点是一个割点,那么会产生。个儿子所在的强连通分量和当前结点父亲所在的强连通分量)个强连通分量。给定一张连通的无向图,问哪些结点是割点,分别删除各个割点时会产生几个强连通分量。是根节点是一个割点,删除根结点会产生。原创 2024-02-07 12:23:40 · 424 阅读 · 0 评论 -
POJ 1236 Network of Schools 题解 Tarjan 缩点
给定一张有向图,问最少在多少个结点上保存文件,使得这些文件可以发送给所有结点,如果一个结点保存的有文件,这个结点可以将文件发送给所有该结点可以到达的结点。的结点个数,只需要在这些结点上面保存文件,所有的结点便均可以收到文件。对于一个强连通的图(除去单个结点组成的图),其各个点的入度与出度均不为。的点,我们只需要建立其到任意一个环(此时一定存在环)上的点的边即可。经过上述的操作后,每个结点一定在一个环上,且每个环都至少和一个环共用一个结点,因此此时图是全联通的,上述操作显然只会增加。另一个结点的入度增加。原创 2024-02-06 19:17:23 · 354 阅读 · 0 评论 -
LibreOJ 10091「一本通 3.5 例 1」受欢迎的牛 题解 Tarjan 缩点 Toposort DAG DP
因此我们可以先将原图进行一次缩点,在同一个强连通块里面的点是可以互相到达的,因此我们只需要考虑缩点的新图上每个点可以从多少个点到达。也就是在新图上面进行。给定一张有向图,问有多少个结点可以从其他所有的结点到达。求出每个结点可以由多少个结点到达,也就是定义状态。表示有多少个结点可以到达结点。原创 2024-02-06 18:11:08 · 275 阅读 · 0 评论 -
Luogu P3388 【模板】割点(割顶) 题解 Tarjan/割点
割点的定义:删除一个点及其连接的边后,若能使图的联通块数量增加,那么被删除的这个点叫做割点。对于根节点,容易发现只要其有多余两个儿子结点则其是割点。结点不会产生新的联通块,如果所有的儿子结点均满足上述的条件,这个结点所在的联通块不能与之前某个遍历的结点相连,也就是说。给定一张无向图,输出割点个数以及割点编号。而如果存在某个儿子结点。经过上述的操作后,对于非根节点结点。(不包含父亲边,除非存在重边)中。出发通过某条边回到某个先于。遍历的结点,也就是删除。算法即可,也就是利用。原创 2024-02-05 18:40:48 · 255 阅读 · 0 评论 -
POJ 1780 Code 题解 欧拉通路 利用栈实现递归
有一种比较暴力的方式可以破解保险箱,即依次从最小的数字输入到最大的数字,例如密码是两位数字,只需要依次输入。位与当前的按键进行拼接,在最优的情况下我们可以保证,每一次按键会产生一个之前没有出现过的密码串,因此对于所有的密码串可能:第一次需要输入。实际上上面建立的图的欧拉回路的起点编号与经过的边的边权组成的序列即为所求序列。,对于这个密码,我们在其后面追加一个按键的时候,其有效的输入就变成了原密码的后。位十进制数字,这个保险箱只要输入包含密码的子串,保险箱就会会打开,例如密码为。原创 2024-02-05 12:21:35 · 1020 阅读 · 0 评论 -
Luogu P2731 [USACO3.3] 骑马修栅栏 Riding the Fences 题解 欧拉通路/欧拉回路
需要注意的时由于每一条无向边只需要经过一次,所以每次进行删除操作的时候,需要将对应的反向边给删除掉。给定一个无向图,求出一条字典序最小的路径(路径通过经过的点来表示),这条路径还需要满足每条无向边经过且只经过一次(不能来回经过)。我们需要找到字典序最小的一条欧拉通路或回路。因此我们首先需要确定起点,如果存在一个点的度数为奇数,那么这个点就是起点,否则我们应该选择编号最小的度数非。同时由于需要输出字典序最小的路径,因此我们可以使用邻接表进行存边,对每一个结点连接的边按照到达结点编号从小到大排序,这样使用。原创 2024-02-05 11:37:04 · 233 阅读 · 0 评论 -
Luogu P6066 [USACO05JAN] Watchcow S 题解 欧拉回路
除此之外,对于有些题目会要求无向边只经过一次,我们在删除边的时候需要将其反向边也给删除掉,而如果使用邻接表进行存边的话,我们需要保存反向边的编号,同时对于自环需要额外注意反向边的编号差异,而如果使用链式前向星则可以通过。算法可以找环,所谓的删除边的操作,我们则可以每遍历一条边即将边给删除,这样只需要一次遍历即可找到欧拉回路或者欧拉通路(因此时间复杂度为。给定一张无向图,输出任意一条从一号结点出发的欧拉回路(欧拉回路指每条无向边来回经过且只经过一次),给定的图保证这样的欧拉回路存在。标志来实现删除边的效果。原创 2024-02-04 21:59:46 · 275 阅读 · 0 评论 -
UVa 10384 The Wall Pusher 推墙者 IDA* 迭代加A*
给定一个网格,和任务起始位置,你的任务是找到一条路径能够走出网格,网格的四周可能会存在墙壁,如果周围有墙壁并且该方向只有连续一堵墙,那么可以推动该堵墙,墙会沿着该方向移动一个距离,但是如果有改方向连续出现两堵或以上的墙则不能往改方向行进(你不能将边缘的墙移除网格)。保证输入存在一组解,输出任意一组解。可以使用曼哈顿距离作为评估函数,搜索的过程也没有难度。原创 2023-03-10 21:45:46 · 120 阅读 · 2 评论 -
UVa 11694 Goigen Naname 谜题 DFS 剪枝 并查集
除此之外我们可以使用一些剪枝来减少搜索状态,我们需要记录当前每个点上的度数和改点最多还能增加多少度数,搜索之前需要先判断,受到影响的四个点是否能够达到输入的要求,不能的话我们直接剪枝即可。我们可以按照位置进行搜索,依次考虑当前位置填入正斜杠和反斜杠,然后判断当前的度数是否满足条件即可。本题可以使用并查集来判环,注意使用并查集的话不能使用路径压缩,不然回溯的时候会丢失信息。原创 2023-03-09 21:25:32 · 64 阅读 · 0 评论 -
UVa 11846 Finding Seats Again 安排座位 DFS 思维转换
一种高效的方式是直接枚举举行而不是在固定的先限制了矩形的大小,枚举出来矩形能够进行下一次搜索的条件是:矩形中只有一个数字,并且矩形的面积等于这个数字。这样为什么能变得高效呢?一是当我们发现矩形里面存在两个数字的时候,下一次的枚举条件可以进行收缩:即将下一次列的最大值压缩到当前结束时的值,这是因为如果下一次枚举矩形超过了这个位置很明显也会存在两个数字。例如上一轮发现有些地方填写了字母,而在下一轮考虑矩阵的位置,可能上一轮填写字母的位置没有移出去,这应该直接判断不能填写,而上述的代码还需要进行循环进行判断。原创 2023-03-07 19:48:53 · 68 阅读 · 0 评论 -
UVa 307 Sticks 木棍拼接 ID 迭代加深搜
本题的难点在于如何进行搜索。小明一开始有一些长度相等的木棍,小明现在将木棍砍成了一些长度为整数的木棍,他现在忘记了最开始木棍的长度,你需要找到最短的可能木棍长度,例如给定。开始,因为初始木棍的数量越多,木棍的长度也短),然后依次搜索所有情况,这就是一个倒序的。由于本题的初始有几根木棍我们并不确定,我们实际上可以倒序枚举初始的木棍数量(从。的木棍砍出来的,但是也可以是两根长度为。的木棍砍出来,也可以是三根长度为。那么这些木棍可以是由一根长度为。是长度最短的,你需要输出。的木棍看出,也可以是。原创 2023-03-03 19:59:26 · 594 阅读 · 0 评论 -
UVa 817 According to Bartjens 数字表达式 DFS ID 迭代加深搜 逆波兰表达式
如何计算表达式的值?三种符号,在保证表达式合法的情况下(同时形成的新的数字不能有前导零),使表达式的结果等于。,输出所有可能的添加方案(你至少要添加一个符号),按照字典序从小到大进行输出。本题只知道至少添加一个符号,所以我们需要依次枚举添加一个、两个、三个一直到。组成的字符串,你需要在数字之间添加。为表达式的长度),然后使用。给定一个由数字和一个。原创 2023-03-02 22:51:39 · 364 阅读 · 0 评论 -
UVa 1533 Moving Pegs 移动小球 BFS 二进制
存在一个如图所示的金字塔形状的网格,其中一个结点为空(图中白色结点),其余结点均放置一个石头(图中黑色结点),空节点的位置会通过输入告诉你,你现在每次可以进行一次移动操作,移动操作可以将一个石头沿直线移动到一个空白,移动后,经过的石头同样会被拿掉(类似于跳棋的规则)例如你可以将。位的二进制来表示每个节点是否存在石头,可以知道的是,一个节点能够移动的方向最多有六个:左上、右上、左、右、左下、右下。位置有一个石头,需要注意的一点是:你不能将一个石头直接移动到空白中,例如你不能将。原创 2023-03-01 22:12:20 · 117 阅读 · 0 评论 -
UVa 12569 Planning mobile robot on Tree (EASY Version) 树上机器人规划(简单版) BFS 二进制
路径的输出有很多种方法,我采用的是记录每个状态的上一次的状态,然后通过递归来输出状态(这里也可以使用一个栈来输出,只要满足先进后出即可),当前的状态与转移到当前状态的标记不同的结点就是发生了移动操作的结点。个位置存在石头,保证初始状态一个结点最多一个物体(一个石头或者一个机器人或者为空),你的任务是用尽量少的操作将机器人移动到目标结点,如果不能到达输出。位的二进制来表示某个结点是否存在石头或者机器人,同时我们可以用一个变量来记录某个状态的机器人的位置。给定一棵树,树上有一个位置存在一个机器人,其他。原创 2023-02-28 20:44:50 · 354 阅读 · 0 评论 -
UVa 11214 Guarding the Chessboard 守卫棋盘 ID 迭代加深搜
放置皇后,到最终时候判断棋盘中的点时候全部被覆盖即可。我们需要用四个数组来表示覆盖情况,这四个数组分别表示:某一行是否被覆盖,某一列是否被覆盖,某条主对角线是否被覆盖,某条副对角线是否被覆盖。容易发现的是:同一条主对角线上的点的横纵坐标之差相等,而同一条副对角线上的横纵坐标之和相等,所以我们就可以通过横纵坐标的和与差来判断改点属于的对角线。的棋盘,棋盘中的某些点是被标记的,你需要防止最少的皇后,让皇后覆盖这些点或者攻击这些点,输出最少的皇后数量。注意:一个皇后的攻击范围为其所在行和列以及两条对角线。原创 2023-02-27 19:11:14 · 84 阅读 · 0 评论 -
UVa 1604 Cubic Eight-Puzzle 立体八数码问题 双向BFS 状态设定
由于目标状态的侧面不确定,所以每个侧面对应两种情况,我们需要初始将所有可能的目标状态放入队列中,然后从起始状态进行搜索即可,需要注意的是,双向。,每个非空格方格有六种状态(分别对应六个面朝上),所以我们可以用一个四位的二进制来表示一共有九个网格所以需要。应该每次选择较小的队列进行搜索,搜索的次数为选择队列当前的大小,而不是一个队列搜索到头。这道题目的细节比较多,推旋转后的状态一定要仔细。的话常数较大,很容易超时,需要注意。本题的思路很简单,我们可以使用双向。给定一个初始状态和一个终止状态的。原创 2023-02-24 22:55:02 · 270 阅读 · 0 评论 -
UVa 12107 Digit Puzzle 数字谜题 迭代加深搜剪枝 IDA*
在搜索到答案之后,我们还需要判断当前答案是否有唯一的解,判断的过程我们同样需要依次填入数字,不过需要注意的是,在判断时候我们实际上只需要把前两个数字的空白都填完就可以进行判断了这样可以推断出第三个数字应该为多少,而如果将三个数字都填完在进行判断的话由于第三个数最多有四位,每个位置有十个数字可以填入,那么复杂度就可能是原来的。本题我们直接进行搜索即可,只是需要注意一些剪枝的地方。具体的输出格式需要参看原题目。这是因为上述的输出只有。原创 2023-02-23 21:02:37 · 261 阅读 · 0 评论 -
UVa 12558 Egyptian Fractions (HARD version) 埃及分数(困难版) IDA 迭代加深搜
我们先来考虑分母的下界,首先为了防止重复枚举,我们需要让下一层的分母比上一层的分母大,这样的话,分母的一个下限就是上一层的枚举值加一,同时我们还需要保证当前枚举的分数比需要组成的分数小,因为题目中要求了不能出现负数,如果当前需要枚举的分数是。我们让当前的位置的分数尽可能的小,同时由于后续的分数必须必当前更小,我们可以假设后续的分数都相等来确定当前位置分母搜索的上界(如果比这个还大,那么后续的分母只有比当前的分母小才能组成当前要求的分数,这就发生了重复搜索),也就是。我们设当前的分母最小值为。原创 2023-02-22 22:49:44 · 168 阅读 · 0 评论 -
UVa 12113 Overlapping Squares 覆盖正方形 二进制表示状态 DFS
个正方形,所以我们可以提前将使用一个正方形,两个正方形,三个正方形,…,六个正方形的所有可能的情况枚举出来,然后保存到一个集合中,这样对于每一次的输入只需要检查输入对应的状态是否在集合中出现过即可。同时并不是每一个位置都能放置正方形,实质上,如果只放一个正方形,那么实际上有九种情况,也就是只有。个位置可以防止正方形,我们可以把能够正方形的位置记录下来,这样可以减少枚举的状态数。表示结尾,其余字符如果为空格表示该位置不是正方形的边界,如果为。位置加上当前正方形放置的位置就是当前正方形对应的。原创 2023-02-21 20:04:49 · 195 阅读 · 0 评论 -
UVa 690 Pipeline Scheduling 流水线调度 二进制表示状态 DFS 剪枝
(注意这里使用的二进制表示和图上是颠倒的,所以此处需要用右移表示时间的流逝,而如果不颠倒处理需要进行特定的位数判断比较麻烦),而当前进程的资源使用情况就是。你的任务是安排十个相同进程的启动时间,使得所有进程完成的时间尽可能的早。,那么此时当前的进程会在那些时刻占用那些资源是可以确定的,而只有当前进程占用的资源与上一个进程占用的资源不存在冲突的时候。所有的开始时间都是可行的,我们能够确定出有限个可行的开始时间。后开始,那么上一个进程在当前进程的各个资源占用会产生影响的部分实际上是。你需要输出最早的完成时间。原创 2023-02-20 22:49:15 · 310 阅读 · 0 评论 -
UVa 818 Cutting Chains 切断圆环链 二进制枚举 判环
首先需要知道的是不能有一个圆环有多余两个的圆环与其相连,因为链的话,每个圆环最多和另外两个圆环相连,也就是我们如果将圆环看成结点的话,连接关系看成结点之间的边的话,那么我们需要保证每个结点的度数小于等于。个圆环,以及一些连接关系表示某些圆环连接在一起,你可以选择一些圆环将这些圆环打开,然后重新连接,问至少要打开多少个圆环才能让所有圆环连接成一条链。其次由于需要是链,所以在整个图中不能出现环,所以我们还需要判断是否出现环(判断环可以通过。对于枚举的状态我们只需要判断该状态是否能够让这些圆环练成一条链。原创 2023-02-19 20:05:18 · 354 阅读 · 0 评论 -
UVa 211 The Domino Effect 多米诺效应 暴力搜索
位置开始进行搜索,每次搜索的时候我们尝试将当前位置和右边的数字或者下边的数字组成一张多米诺骨牌,然后下一次搜索的位置变为当前位置向右移动一个,当然这样进行搜索的话右边的左边的数字可能已经被使用过了,所以我们在右边坐标数字被使用过的情况下只需要再往右边进行搜索,知道右边的数字没有被使用或者当前已经到达最右边了,但是还是被使用了,那么我们直接到下一行进行搜索即可。那么这样搜索的深度是。但是这样得到的一个搜索树是稀疏的,因为当某一个位置确定了之后随即就有另一个位置确定,那么搜索结点个数应该是不超过。原创 2023-02-18 19:43:47 · 615 阅读 · 0 评论 -
UVa 225 Golygons 黄金图形 暴力搜索 剪枝 状态判断
本题我们从原点开始搜索下一次移动后的位置,并且我们判断移动路径上是否存在障碍物,如果不存在我们才能移动,同时需要判断到达的点我们之前是否到达过。走得过程中不能穿过或者到达障碍物所在的点,你走得方向为东南西北(也就是上下左右),但是需要注意的是,你每走一步你必须进行一次。可以使用的剪枝:如果我们当前位置的横纵坐标的和大于剩下可以走得步数,那么我们可以直接进行剪枝。次,第一次走一个单位距离,第二次走二个单位距离,…次移动之后我们只需要判断是否回到了原点。个障碍物的坐标,你需要走。的转向,输出所有能够从。原创 2023-02-17 22:18:25 · 998 阅读 · 0 评论 -
UVa 1602 Lattice Animals 网格动物 状态判断 暴力枚举 打表
我们只需要实现顺时针或者逆时针旋转中的一种,我们以顺时针旋转为例,首先我们需要确定的是沿着哪一个方块进行旋转,在这里,我们可以沿着左上角的方块旋转,不难发现,这样旋转后的横坐标变为原来的纵坐标,旋转后的纵坐标变为原来横坐标的相反数,需要注意的是,我们旋转后还需要进行一次平移操作,将旋转后的图形移动到左上角。的复杂的,这里只给出如何计算出各种情况下答案的代码而没有给出打表的程序(打表只需要把所有的答案都输出到出来,然后将答案存在一个数组中即可,这样就可以。上下翻转,左右翻转,平移后相同的联通块看做一种。原创 2023-02-16 23:33:37 · 175 阅读 · 0 评论 -
UVa 1343 The Rotation Game 旋转游戏 IDA* BFS 路径还原
算法,直接依次枚举进行的操作(需要注意的是,应该先枚举字典序小的),很明显可以发现,每一次移动最多只会让中间的位置正确的数字个数增加一,所以可以考虑的剪枝是:最大深度与当前深度之差如果小于中间最少的不对的数字时进行剪枝。来解决本题的时候,我们可以转换一下思路,我们可以把目标状态能够到达的所有其他状态枚举出来,这样的花费与从某个状态到目标状态是一样的。操作如何进行,其他的操作如何进行可以类似的推出,你的任务是找到最少的操作步数让中间的八个数字为同一个数字,例如上图左边经过两次操作能将中间全部变成。原创 2023-02-15 21:22:50 · 362 阅读 · 2 评论 -
UVa 12325 Zombie‘s Treasure Chest 僵尸的宝藏 奇特的枚举方式
起始我们可以不用枚举两种宝物装入的数量,只需要枚举其中一个宝物装入的数量,而当一个宝物装入的数量确定了,那么另一个宝物的装入数量应该是在剩余容量能够装下的情况下尽可能的装入,这样的话是件复杂度就变成了。,但是如果我们一开始不装入价值密度大的宝物,而是直接装入两个宝物二,那么得到的答案就是。,如果先装入价值密度大的,这里也就是宝物一,这个时候就装不下宝物二了,得到的答案是。均比较小的时候,我们可以根据上式的等式来选择枚举的对象,此时的复杂度是。《算法竞赛-入门经典》第二版 刘汝佳。个,我们可以把其中的。原创 2023-02-14 19:28:22 · 198 阅读 · 0 评论