1.FZU - 2150 大意:给定一个n*m的草地,每个格子上‘#’表示草坪,‘.’表示空地,开始选两块草坪放火(两块草坪可以是一个位置),每过一分钟火向四周蔓延一个单位(上下左右四个方向)当然遇到空地火就不能蔓延了,问把全部草坪烧掉的最短时间,如果没办法烧完输出-1。
思路:双起点bfs,也就是多源bfs,刚开始看到这道题并没什么思路,原因还是在于对多源bfs理解不够透彻。然后去复习了下多源bfs,才看出这道题就是考的多源bfs。先来想想多源bfs:其实多源bfs和bfs的区别就仅仅是多源bfs在起始的时候加入多个起点。最后求出的从其中任意一个起点扩展到终点的所有方案中的最小值。为什么直接扩展就行了呢?首先基于bfs的特点:一层一层扩展,每次权重都是一样,每次扩展放到队尾,因此在队列里总是单调不降的,所以每次扩展都是以最优的一种方式扩展,我们不去考虑他是哪个起点扩展到的,只关注他是合法的,而且是最优的就行了。这就是多源bfs的本质以及正确性。知道了可以本题的本质是多源bfs之后就很简单了,暴力枚举,把所有的草坪先记录下来,然后每次选两个,求出最小的一种就行了。
总结:关键是对多源bfs的理解:多源bfs就是在普通bfs的基础上加入多个起点。
2.UVA - 11624 大意:又是火烧迷宫。。。,给定一个n行m列的迷宫,“#”代表墙,火和人都不能走 “.”代表空地火和人能走的,“J”代表人,“F”代表火,(有且只有一个“J”)人每分钟向四周走一个单位,走到边缘的".",且没遇到火认为能安全逃脱,当然从边缘离开迷宫也得加1,火每分钟向四周蔓延一个单位,(四周是指上下左右),求人能安全离开迷宫的最短时间,如果不能安全逃脱输出“IMPOSSIBLE”。
思路:这题思路还是很好想的,和之前做过的洛谷上的流星差不多,先求出火蔓延到某个位置时的最短时间作为人逃脱时的限制条件,(此题有个坑点就是不一定只有一堆火,再次体现出读题的重要性。)多堆火也就是多源bfs,没问题。人逃脱,简单的最短路走迷宫问题,只不过加了些限制条件,有些点不能走而已,也没问题。写好了,信心满满的交了。wa了。小细节limit限制条件初始化为inf而不是0,初始化位0的话会多出很多“可以限制的”点,到此完结。
总结:走迷宫时遇到会变化的阻碍,可以开一个数组,先根据阻碍的变化提前纪录每个点的限制条件,在正式搜索的时候根据限制条件判断某个点到底能不能走。注意限制数组的初始化,确保阻碍没影响到的点对正式搜索没有影响。
今天先写这么多,害,回去要写实验报告。。。。