2021.2.5做题小结

1.「POJ1475」Pushing Boxes

题目:推箱子,求推动次数最少的路径,有推动次数相同方案时输出走路次数最少的路径。

思路:bfs 套 bfs

定义五元组 (bx,by,mx,my,route) 表示箱子在 (bx,by) 位置,人在 (mx,my) ,路程 route 的状态。注意细节即可

同时发现除了第一次人是奔着箱子去的,其他时候总是人推了箱子后要么继续推要么到箱子另一个方向继续推的。所以将三元组(x,y,k),k=0~3作为每一次搜索的状态,f_box[x][y][k],f_man[x][y][k]记录箱子和人的最少步数。

① 箱子在(x,y)不动,人从箱子的相邻位置k1移动到另一个相邻位置k2,且中途不经过(x,y) ② 人从当前位置向前推动箱子,人移动到箱子位置处 ③ 将新状态的入队,并记录步数。

注意:poj的spj不完全,差评!(调了我2h+)

2.「POJ3635」Full Tank?

题意:给一张无向图,每个点有一个油价ai,表示每升油的单价。每条道路连接两个点,且有个权值wi,表示开过这条路所消耗的油量。现在有q个询问,每个询问给出一个油箱容量c,一个起始点和一个终止点,要求出从起始点到终止点最少要消费多少钱。初始油箱为空。

思路:优先队列BFS

使用三元组 (id,has,cost) 表示现在在城市id,有has单位油,花了cost元钱。对于每个状态:

①若 has+1<=c,则可以加 1 升油,扩展到新状态 (id,has+1,cost+a[id]) ②对于每条边 (id,v) ,若 w<=has,则可以扩展到新状态 (v,has-w,cost)

对于情况②,发现新状态 (v,has-w,cost) 会被多次遍历,可以通过使用数组 dis[id][has] 记录下在城市 id,有 has 单位油时的最小花费,扩展前进行比较即可。(同时可以省去三元组中第三元)

注意:"impossible"小写。

3.「HDU3085」Nightmare Ⅱ

题意:A、B在迷宫中,A每回合能走3步,B每回合能走1步,迷宫中还有2个鬼,每回合最先活动,会向两步内的格子分裂,A、B不能碰鬼,求他们最快见面的回合数

思路: 题目中描述A能走3步,实际上意思是A每回合能移动[0,3]步,B也同理,所以只要考虑A、B尽可能最远到达的区域,在当前回合这些区域内都是可达的

 将整个题目可以考虑为一个像染色的模型,A、B、鬼分别以每回合3、1、2的速度染色,染色的部分就是他们当前回合能够到达的所有部分。找出A、B最快染到对方颜色块上的回合数

A、B每回合都单独行动,所以考虑用双向BFS

注意: A 的步长为 3。实时计算新状态和鬼的距离

4.电路维修

题意:http://fzuoj.xndxfz.com/problem/2781

思路:双端队列 bfs 0(rc)

5.「NOI1999」生日蛋糕

题意:http://fzuoj.xndxfz.com/problem/1603

思路:dfs剪枝

上下界剪枝:在第 dep 层,半径 r 在 [dep,min(sqrt(N-v),r[dep+1]-1] 中,高度 h 在 [dep,min(sqrt(N-v)/r^2,h[dep+1]-1] 中;

优化搜索顺序,倒序枚举

可行性:若当前体积 v 加上 dep-1 层最小体积大于 N ,剪

最优性:若当前表面积 s 加上 1~dep-1 层的最小侧面积大于已经得到的答案,剪(有一点IDAstar的味道)

6.「POJ1011」小木棍

题意:http://fzuoj.xndxfz.com/problem/2529

思路:dfs剪枝,具体见:https://www.cnblogs.com/wyb-sen/p/14021696.html

 

7.[POJ3076]Sudoku

题意:用A~P填写一个16*16的数独。

思路:dfs剪枝,具体见:https://www.cnblogs.com/wyb-sen/p/14380385.html

posted @ 2021-02-05 21:08  _Famiglistimo  阅读(68)  评论(0编辑  收藏  举报