暴力搜索

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

暴力搜索的算法步驟:測試

1)第一個解做爲當前解。spa

2)處理當前解(若是知足條件則輸出,不然忽略)。code

3)生成下一個解做爲當前解,繼續2下去。blog

因此也將稱其爲窮舉或者生成-測試。尤爲是名字生成-測試更能反映其算法結構。ip

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

 

問題:給出一些數目,能夠用加減乘除計算結果,求一些知足條件的結果。例如算24點。數學

簡化:生成+-*/的全部可能計算方式。(貌似不是數學中的排列,也不是數學中的組合)it

求解:暴力搜索法。io

// 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;
}
相關文章
相關標籤/搜索