zoukankan      html  css  js  c++  java
  • 红书上的几道搜索例题

    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就好了

      不过上述做法都有一个缺陷,没有证明交叉的矿道不是最优解,然而我并没有证明出来

  • 相关阅读:
    CF1202F You Are Given Some Letters...
    CF1178E Archaeology
    PTA (Advanced Level) 1005 Spell It Right
    PTA (Advanced Level) 1004 Counting Leaves
    Qt5——从零开始的Hello World教程(Qt Creator)
    PTA (Advanced Level) 1003 Emergency
    PTA (Advanced Level) 1002 A+B for Polynomials
    HDU 1272 小希的迷宫
    FZU 2150 Fire Game
    HihoCoder
  • 原文地址:https://www.cnblogs.com/jihe/p/5931755.html
Copyright © 2011-2022 走看看