zoukankan      html  css  js  c++  java
  • 暴力搜索

    http://en.wikipedia.org/wiki/Brute_force_search

    暴力搜索的算法步骤:

    1)第一个解作为当前解。

    2)处理当前解(如果满足条件则输出,否则忽略)。

    3)生成下一个解作为当前解,继续2下去。

    所以也将称其为穷举或者生成-测试。尤其是名字生成-测试更能反映其算法结构。

    即:first(); do { } while (next());

    问题:给出一些数目,可以用加减乘除计算结果,求一些满足条件的结果。例如算24点。

    简化:生成+-*/的所有可能计算方式。(貌似不是数学中的排列,也不是数学中的组合)

    求解:暴力搜索法。

    // 0=>+, 1=>-, 2=>*, 3=>/
    int op[100];
    
    void first(int n)
    {
        for(int i = 0; i <= n-1; i++) 
        {
            op[i] = 0;
        }
    }
    bool last()
    {
        if (op[0] == 4) 
        {
            return true;
        }
        else 
        {
            return false;
        }
    }
    bool next(int n)
    {
        if (last())
        {
            return false;
        }
        int i = n-1;
        op[i]++;
        while (op[i] == 4 && i >= 1) 
        {
            op[i] = 0;
            op[i-1]++;
            i--;
        }
    
        while ( i>=0 && op[i]==0 )
        {
            i--;
            op[i] = (op[i]+1)%4;
        }
        return true;
    }
    
    bool valid()
    {
        if (last()) 
        {
            return false;
        }
        else
        {
            return true;
        }
    }
    void output(int n)
    {
        for(int i = 0; i <= n-1; i++)
        {
            switch (op[i]) {
            case 0:
                cout << "+";
                break;
            case 1:
                cout << "-";
                break;
            case 2:
                cout << "*";
                break;
            case 3:
                cout << "/";
                break;
            default:
                cout << "error";
                break;
            }
        }
        cout << endl;
    }
    
    void brute_force_search(int n)
    {
        first(n);
        int count = 0;
        do
        {
            if (valid()) 
            {
                count++;
                output(n);
            }
        } while(next(n));
        cout << count << " solutions found!" << endl;
    }
  • 相关阅读:
    搜索栏+collectionView实现
    iOS密码框实现(二)取消确定按钮
    MotionManager 陀螺仪实现方式
    ubuntu常用命令
    Ubuntu 启用root账户
    How to solve “sudo: /etc/sudoers.d is world writable”
    ubuntu進入dos界面的方法
    炫耀一下hadoop學習成果
    fpdf使用標楷體
    win8磁盘占用100%的12种解决办法
  • 原文地址:https://www.cnblogs.com/jiejue/p/3151740.html
Copyright © 2011-2022 走看看