红书上的几道搜索例题
Holedox Moving poj 1324
题意:贪吃蛇,n*m的网格,蛇长度《=8,给出蛇的每个身体的位置,求到(1,1)点的最短距离
http://www.cnblogs.com/longdouhzt/archive/2011/11/17/2253233.html这个xjb搞,效果还是不错的
分析:状态数一定,目标一定,压缩状态然后bfs,但是每一位都用(x,y)来表示状态太大,那么还要转换状态,蛇头位置显然要表示,那么剩下的身体只要知道上一段身体在哪,就可以知道现在的坐标了,那么,可以(x,y)+7位相当于上一位往哪个方向移动,这样,状态总数20*20*4^7,这样来bfs问题就不大了,直接bfs姿势不好显然会T,移动蛇身的时候,用位运算位移一下,queue一定要开在外面,否则会RE,自己模拟队列也行,这样就可以过了,时间大约要1300ms左右,剩下的就是如何剪枝了,Alpha-Beta,剩下的就是上界和下界的设计
1.下界显然可以忽略蛇身,舌头直接到目的地的距离,上界,显然可以用舌头移动,把蛇身当作障碍物,这样的距离当作下界,酱紫,就可以很快得到答案
Mines For Diamonds uva 10605
n*m的矿区,里面有一些钻石,需要挖掘一些矿道,使得每个钻石都与外界相同,矿道不得交叉,求最小挖掘距离
搜索题,盲目搜索,随机选择一个边界,然后所有的钻石都被挖通,显然是行不通的,简单的想法就是加入最优性剪枝,当前的最优解为L,已挖掘的为x,估计符合条件的最少f,x+f>L,减去
直接把剩下所有钻石到现在的距离作为上界,效果并不是很好,弱化条件,矿道不能交叉,弱化为矿道仅可以在钻石处交叉,这样,可以把钻石当作点,每两个钻石处连一条边,然后MST作为下界
还有人这么做,处理出所有点和边之间的最小距离,然后枚举点之间的顺序,贪心该挖掘顺序的最小花费
最神奇的是,这个题根本不是搜索,是个状压dp,处理出每个点到边界的最小距离,点之间的距离就是曼哈顿距离,然后状压dp就好了
不过上述做法都有一个缺陷,没有证明交叉的矿道不是最优解,然而我并没有证明出来