zoukankan      html  css  js  c++  java
  • 搜索专题

    搜索问题解决的是在某一范围内得到最优解的问题,此处主要介绍DFS和BFS(深度优先搜索及广度优先搜索)
    DFS和BFS究其本质是栈stack和队列queue的搜索策略
    DFS比较适合最优解问题,可以通过剪枝等策略优化搜索过程
    BFS比较适合集群数量问题,快速得出可选择方向的个数

    DFS通用代码

    int maxsumSque = 0;
    vector<int> temp,ans;//存放最优解序列,模仿入栈出栈过程,如果不需要输出序列,可省去
    //index为方向选择,nowK为已经入栈的个数,sum需要满足的条件,sumSqu序列的优劣记录
    void DFS(int index,int nowK, int sum,int sumSqu){
        if(nowK == k && sum == x){
            if(sumSqu > maxsumSque){//更优
                maxsumSque = sumSqu;
                ans = temp;
            }
            return;
        }
        if(nowK > k||index==n||sum>x)
            return;
        //选方向index
        temp.push_back(A[index]);//存放序列
        DFS(index + 1, nowK + 1, sum + A[index], sumSque + B[index]);
        temp.pop_back();
        //退回找下一个方向
        DFS(index+1,nowK,sum,sumSqu)
    }
    

    BFS通用代码

    bool inq[N];//是否入队过
    
    //BFS,用前需要用judge判断是否能入队
    void BFS(typename s){
        queue<node> Q;
        Q.push(s);//入队
        inq[s] = true;
        while(Q.empty()==false){//队列未空
            node top = Q.front();//队首元素出列
            Q.pop();
            for(int i = 0;i<index;i++){
                //从index方向搜索
                if(index方向能搜索就入列){
                    s = A[index];
                    Q.push(s);
                    inq[s] = true;
                }
            }
        }
        return;
    }
    

    BFS拓展:由于一般使用的队列是STL容器中的queue,只是一个元素副本入列,如果需要对该元素(尤其是结构体)进行更改,很容易造成内外数据不一致导致bug,可以用入队元素编号(如下标)而不是元素本身来解决

  • 相关阅读:
    回顾2016,工作总结!
    上传base64格式的图片到服务器
    input输入提示历史记录
    input输入时软键盘回车显示搜索
    JS设置和读取Cookie
    正则表达式识别字符串中的URL
    X-Frame-Options配置
    pytest学习笔记
    测试理论基础总结
    redis杂七杂八
  • 原文地址:https://www.cnblogs.com/shuibeng/p/13603173.html
Copyright © 2011-2022 走看看