BFS
HDU 1548 :给出起点和终点,还有电梯在每一层能够上升或者下降的高度,问能否到达
Dir[]里面存-1,1就可以了
HDU 1372:马步移动,dir[8][2]8个方向搜
HDU 2717:步数为+1,-1,*2,三个方向搜
HDU 1072:给出一个矩阵,矩阵里面是数字,一个人背着炸弹从起点走到终点,炸弹的引爆时间是6秒,
每一秒这个人移动一步,遇到数字4的话,引爆时间又重新置为0,问他能否到达终点
这道题目先以为和紫书上一题是一样的,先自己写的时候用的一个三维数组来标记状态
后来搜题解发现不是这样的,
有两种办法
一个是,如果下一次走到相同坐标的时候,离爆炸的时间增大了,才有必要将这个节点加入队列,如果更小的话,就不用再加进队列了(因为上一次到这儿离爆炸的时间更多都没能够到达终点,现在时间更少就更不能够了)
然后第二种是:每次进入4都会获得6秒钟,那么下次再进入4,也就不会再获得更多的了,
所以4的点只访问一次
HDU 1728:给出起点还有终点,限定转弯的次数,问能否到达终点,在节点结构体里面保存下当前的方向dir(这个用搜的时候的那个i来算),还有当前转弯的总的个数
有一个剪枝就是如果到达某个坐标的转弯个数大于之前的到达这个点的转弯次数,它就不用加进队列了
HDU 1175:给出起点终点的棋子,转弯次数不超过2次,问能否消除,再上一题的基础上再特判一下起点终点是不是一样的,还有起点终点为不为0
HDU 1429:给出起点终点,小写字母代表钥匙,相应的大写字母代表门,必须有钥匙才能通过门,问从起点到终点需要的步数,
自己先用一个数组来记录有没有相应的钥匙,写出来不对,后来搜题解发现是状态压缩的
详情看这篇http://www.cnblogs.com/wally/archive/2013/01/26/2878259.html
然后就和之前的差不多了,开一个三维的数组记录状态,遇到门,看有没有相应的钥匙,有就通过,没有就不能通过,
遇到钥匙,要是还没有相应的钥匙的话,就加进去
HDU 1885:和上面一道题一样,只不过给出的字母是B,Y,R,G,直接用字母表里面的编号太大了,用map映射编一下号,就和上一题一模一样了
HDU 2181:给出起点终点,以及20条边,输出所有可行路径,用vector先把边存下来,再dfs
HDU 1180:给出起点终点,有一些格子里面放着楼梯,分竖着”|”,”-”两种,每一秒梯子的状态发生一次改变,问从起点到达终点所需要的最短时间
自己写wa了好久,后来搜题解才知道,如果能够通过楼梯的话,是瞬间就通过的,即在楼梯那一格不需要花费时间
所以每个点就有五种状态,上下左右,停在原地等,然后每次走到楼梯的时候判断一下时间的奇偶
UVa 1600:给出起点终点,不能连续穿过k个障碍物,问从起点到终点需要的步数
节点里面增加一个k来存当前还能够穿多少个障碍
用一个三维的数组记录状态,然后碰到障碍,节点里面的k-1,遇到空地k又重新变为k
另外:看线段树的区间更新还是没有看懂-----------------------
本周做了一场cf,过了两道题
go-------------------------------------