zoukankan      html  css  js  c++  java
  • [HDU] 2616 Kill the monster 一种基本剪枝的暴力深搜

    题目链接:

    http://acm.hdu.edu.cn/showproblem.php?pid=2616

     方法:深搜树中每一个状态节点包含的信息为:使用武器的标号,怪物还剩余的生命值,以及该节点处于的层数也就是使用了多少个武器。然后分别以每一个武器作为树的根节点以实现暴力深搜。深搜的过程中用到一个很基本的剪枝方法,那就是在搜索过程中维护一个当前已经获取的最优解,该题目中为当前为了消灭怪物使用武器数量最下那个数量MinCount,然后每一个次搜索的时候发现如果再继续搜索很得到次于当前最有解的解,是不会被选择的解,于是再搜索便无意义,所以就剪掉,在该题目中,如果发现当前节点的层数已经大于当前MinCoun,剪掉。

    感想:简单题

    代码:

    View Code
    #include <iostream>
    #include <queue>
    #include<algorithm>
    using namespace std;
    int n,m;
    const int MAX=0x7fffffff;
    bool v[10];
    struct Spell
    {
        int injure;
        int boundary;
    };
    Spell spells[10];
    struct Step
    {
        int x;
        int currentRemain;
        int layer;
    };
    int currentMostFast =MAX;
    int BFSSearch(Step step)
    {
        int re=MAX;
        if(step.currentRemain<=0)
        {
            if(currentMostFast>step.layer)
                currentMostFast= step.layer;
            return step.layer;
        }
        v[step.x] = true;
        for(int i=0;i<n;i++)
        {
            if(!v[i])
            {
                Step n_step;
                n_step.x = i;
                n_step.layer =step.layer+1;
                n_step.currentRemain = step.currentRemain  -spells[n_step.x].injure *( step.currentRemain <= spells[n_step.x].boundary ? 2:1);
                if(n_step.layer<currentMostFast)
                {
                    int t_re = BFSSearch(n_step);
                    re = re > t_re ? t_re :re;
                }
            }
        }
        v[step.x] = false;
        return re;
    }
    int BFSSearch(int start)
    { 
        Step step; 
        step.x=start;
        step.layer=1;
        step.currentRemain = spells[start].boundary >= m ? m-spells[start].injure*2 :  m-spells[start].injure;
        return BFSSearch(step);;
    }
     
    void main()
    {
        while(scanf("%d %d",&n,&m)!=EOF)
        {
            int re =MAX,t_re;
            currentMostFast =MAX;
            for(int i=0;i<n;i++)
                scanf("%d %d",&spells[i].injure,&spells[i].boundary);
            for(int i=0;i<n;i++)
            {
                t_re = BFSSearch(i);
                re = re > t_re ? t_re : re;
            }
            cout<< (re == MAX ? -1 :re)<<endl;
        }
    }
  • 相关阅读:
    项目记录,仿今日头条app
    数组过滤后的重新排序问题
    用函数刷新页面内容比刷新页面要好
    html js绑定键盘按键触发事件(按回车键登陆)
    图片上传前压缩 lrz库
    微信 获取openid
    旅游项目总结
    UWP深入学习五: 传感器与搜索、共享及链接
    UWP深入学习四:动画及图像
    UWP深入学习三:依赖属性、附加属性和数据绑定
  • 原文地址:https://www.cnblogs.com/kbyd/p/3034593.html
Copyright © 2011-2022 走看看