暴力搜索

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;
}

 

 

posted on 2013-06-23 23:18  caigen  阅读(1858)  评论(0编辑  收藏  举报