算法与数据结构
文章平均质量分 68
沙河板混
这个作者很懒,什么都没留下…
展开
-
DFS深度优先搜索:Square
搜索状态三元组(sum,number,position),其中 sum 是当前拼凑的木棍长度,number是已拼凑成边长的数量,position是当前木棍的编号。因为如果总长 length 能够整除 4,且已经拼凑出3条边,那么剩下的木棍必定可以构成最后的一条边。首先,将木棍长度进行累加,得到总长 length;之后,将木棍拼凑成长度为 side 的边,拼凑完一条边后,再拼凑下一条,直到拼凑出4条长度为 side 的边,(3) 拼凑中发现某长度的木棍无法构成当前边时,再遇等长木棍时可跳过(需排序)。原创 2024-07-20 16:56:29 · 322 阅读 · 0 评论 -
DFS深度优先搜索:A Knight‘s Journey
搜索状态三元组(x,y,step),(x,y)是当前点的坐标,step 是从起点走到该点经过的步数。需要搜索到的最终目标状态为(x,y,step),其中 step=p*g,即经过的步数等于棋盘的格数。题目要求在所有可行的路径中输出字母表排序最小的那个解,如果存在一条路径可以遍历所有方格的路径,那么该路径必定会过点 A1。在本题中需要记录棋盘中的某点骑士是否曾经访问过,以便确保骑士的路径上没有重复地经过同一点,也只有这样,判断 step=p*g 才有意义。骑士按照“日字规则行走。骑士的世界就是他生活的棋盘。原创 2024-07-20 16:33:08 · 1026 阅读 · 0 评论 -
BFS宽度优先搜索:Find The Multiple
本题乍看之下好像和宽度优先搜索无关,只需逐个测试n的倍数是否全由0和1组成即可,但这样做相当于枚举,需要枚举n在整个搜索空间(小于 100 位的整数)中的所有倍数,这个计算量非常大,因为逐个判断会花费大量时间,因此这种方法的效率非常低可以反过来想这个问题:只由0和1组成的数相比于整个搜索空间而言是非常少的,可以去搜索由0和1组成的数,然后通过判断这些数能否整除n来求解这个问题。由于从初始状态1开始不断扩展,扩展的数字必定比之前的数字大,扩展出来的状态不可能在此前出现过,因此不需要用数组来记录访问过的数字。原创 2024-07-14 15:31:00 · 351 阅读 · 0 评论 -
BFS广度优先搜索:Catch That Cow
由于任意一个状态(n,#)经过1秒后可以转入下一个状态,所以说任意一个状态(n,0)可以扩展为三种状态(n-1,t+1),(n+1,t+1)(2n,t+1)中的合法状态。再按邻居结点访问的先后顺序依次地扩展到它们能够到达的下一个状态,以此类推,当扩展到目标状态(K,0)时,目标状态中的t必然为最短耗时。在本题中,由于是求从起点N到终点K的最短耗时,因此可以设定状态为二元组(n,0),其中n为农夫约翰当前所在位置的坐标点,为从起点N走到当前坐标点n所耗费的时间。农夫约翰有两种交通方式:步行和传送。原创 2024-07-05 16:50:06 · 911 阅读 · 0 评论 -
递归:汉诺塔问题III
这一移动完成后,第一根杆上仅剩下最大的圆盘,第二根杆上为空,第三根杆上按顺序摆放着N-1个圆盘。若从第一根杆上移动 N 个圆盘到第三根杆上需要 F[N]次移动,那么综上所述 F[N]的组成方式如下:先移动N-1个圆盘到第三根杆上需要 F[N-11次移动,然后将最大的圆盘移动到中间杆上需要1次移动,再将N-1个圆盘移动回第一根杆上同样需要 F[N-1]次移动,移动最大的盘子到第三根杆上需要1次移动,最后将N-1个圆盘移动到第三根杆上需要F[N-1]次移动,于是便有了F[N]=3F[N-1]+2。原创 2024-06-18 16:48:09 · 289 阅读 · 0 评论 -
区间贪心:今年暑假不AC
当然,作为新时代的好青年,你一定还会看一些其他的节目,如《新闻联播》(永远不要忘记关心国家大事)《非常 6+7》《超级女声》及王小丫主持的《开心辞典》等,假设你已经知道了所有你喜欢看的电视节目的转播时间表,你会合理安排吗?(2)如果当前时间不能够观看该节目(当前时间已超过该节目的开始时间),那么就选择放弃观看该节目,进而去判断下一个节目是否符合要求。(1)如果当前时间能够观看该节目(即当前时间小于等于该节目的开始时间),那么就选择观看该节目,并将当前时间更新为该节目的结束时间。“看世界杯呀,笨蛋!原创 2024-06-11 15:39:35 · 328 阅读 · 0 评论 -
贪心策略:FatMouse‘ Trade
相反,如果老鼠支付 a%*F[]的猫粮,那么可以获得 a%*Л[]的咖啡豆。看到这一题,精于计算的读者可能会马上反应过来,这和日常买物品是一样的,每次购买商品的时候,优先挑选剩余物品中性价比(即重量价格之比)最高的物品,直到该物。本题中,每个房间的咖啡豆(JavaBean)对应于不同的商品,每个房间的 J[i]代表该商品的重量,F[i]代表该商品的价格,老鼠手中的猫粮对应于金钱。① 若当前性价比最高的物品已被买完,则继续在剩余的物品中寻找性价比最高的物品,并不断重复这个过程。品被买完或金钱耗尽。原创 2024-06-06 16:15:39 · 630 阅读 · 0 评论 -
快速幂:人见人爱A^B
毫无疑问,这是不可行的。按照题面给出的输入规模,A^B 至多可以达到 10000 的 10000 次方,这么庞大的数字是不容易存储的,但 A^B 的后三位数其只与A的后三位数和B有关。由于题目要求的只是结果的后三位数,因此在计算该结果的过程中产生的中间值也只需保存其后三位数即可。输入数据包含多个测试实例,每个实例占一行,由两个正整数A和B组成(1<=A,B<=10008)如果 A=0,B=0,则表示输入数据的结束,不做处理。对于每个测试实例,请输出 A^B 的最后三位表示的整数,每个输出占一行。原创 2024-06-04 15:20:20 · 197 阅读 · 0 评论 -
最大公约数与最小公倍数
那么a,b两数的最小公倍数n = g * l * k。即两数的最小公倍数为两数乘积除以两数的最大公约数。现在用欧几里得原理求最大公约数的代码为。设a,b两数的最大公约数为g。原创 2024-05-20 15:44:50 · 138 阅读 · 1 评论 -
队列:动物收养所
于是,对于选择性地收养动物的第二种方式,实现起来就会非常简单:根据要收养的是猫还是狗,从相应的队列中取出队列头部的动物。然而,对于第一种收养方式,需要判断两个队列头部的猫和狗哪个更先进入收容所,这时需要有一个标志进行判断。然而,如果只维护一个队列,那么对于直接收养所有动物中最早进入收容所的第一种收养方式,实现起来就会非常简单:只需每次取出队列头部的动物。但是,这样做的话,对于选择性地收养动物的第二种方式就会比较复杂,此时需要访问整个队列,以便找出第一个被访问的猫或第一个被访问的狗。若为-1,则指定收养猫。原创 2024-05-11 16:56:21 · 391 阅读 · 0 评论 -
括号匹配问题
因此,可以从左至右的顺序遍历整个字符串,遍历过程中遇到左括号,就将其放入栈中以等待后续右括号的匹配;当字符串全部遍历完后,若栈非空,则表明栈中的左括号不存在与之匹配的右括号,左括号匹配失败。写一个程序,找到无法匹配的左括号和右括号,输出原来的字符串,并在下一行标出不能匹配的括号。不能匹配的左括号用"$"标注,不能匹配的右括号用"?"表示与之对应的左括号和右括号不能匹配。C版本的代码比Java更加简化,将判断括号情况的栈和存储未匹配的左括号下标的栈合为一个(右括号未匹配直接在字符串中进行修改)原创 2024-05-11 16:23:20 · 293 阅读 · 0 评论 -
约瑟夫问题No.2 C/C++和Java代码
n个小孩围坐成一圈,并按顺时针编号为1,2,…,,从编号为p 的小孩顺时针依次报数,由1报到m,报到m时,这名小孩从圈中出去;然后下一名小孩再从1报数,报到m 时再出去。以此类推,直到所有小孩都从圈中出去。请按出去的先后顺序输出小孩的编号。这道题是著名约瑟夫问题的变体。当约瑟夫问题的数据规模不大时,可以考虑直接利用循环队列进行模拟进行求解。第一个是n,第二个是p,第三个是 m(0原创 2024-05-09 16:36:36 · 211 阅读 · 1 评论