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

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

  • 相关阅读:
    大学总结(一)
    关于数组名与指针的相互转换
    错误:无法执行操作,因为未将指定的 Storyboard 应用到此交互控件的对象
    延迟初始化 (Lazy Initialization)
    Sql Server 中 GAM、SGAM、PAM、IAM、DCM 和 BCM 的详解与区别
    Xml格式的字符串(string)到DataSet(DataTable)的转换
    Sql Server 内存用不上的解决办法
    Sql Server 管理区分配(GAM,SGAM)和可用空间(PAM)的原理
    Sql Server LightWeight Pooling(纤程) 选项
    在线 Sql Server 服务无法启动的解决办法
  • 原文地址:https://www.cnblogs.com/jihe/p/5931755.html
Copyright © 2011-2022 走看看