C++寫一個排列組合小程序


今天突然想到一個問題,有時候,針對同一個事件有多種反映,特別是游戲AI當中,這種情況下需要采取最適合的方案,哪種方案最適合,可以將每種方案的結果或影響都計算一遍,從而選擇最合適的。最基本就是一個排列組合方法,將各種方案都組合出來。於是寫了一個基本的N個數排列組合小程序!

開發工具:Visual Studio 2012

 

CTestPermutation::~CTestPermutation()
{
    cout<<">>>>>>>>>>>>>>>>>>>>>>>>CTestPermutation::~CTestPermutation()"<<endl;
}

void CTestPermutation::DoTest()
{
    cout<<"-------將N個數進行排列組合-------"<<endl<<endl;
    vector<int> vecNums,vecPermutated;
    cout<<"示例數據:";
    for(int i = 1; i < 5;i++)
    {
        vecNums.push_back(i);
        cout<<i<<" ";
    }
    cout<<endl;
    cout<<"排列組合結果:"<<endl;
    Permutation(vecPermutated,vecNums);

}

/******************************************************
 @ FunctionNmae:            Permutation
 @ Function:                將N個數進行排列組合
 @ vecPermutated:           已經排列好的數列
 @ vecWaitPermuta:          待排列的數
********************************************************/

void CTestPermutation::Permutation(vector<int> vecPermutated,vector<int> vecWaitPermuta)
{
    if(vecWaitPermuta.size() > 0 )
    {
        for(vector<int>::iterator itNum = vecWaitPermuta.begin();itNum != vecWaitPermuta.end();++itNum)
        {
            vector<int> vecPermutatedTmp = vecPermutated;
            vecPermutatedTmp.push_back(*itNum);

            vector<int> vecWaitPermutaTmp = vecWaitPermuta;
            //刪除當前已經加入排列完畢的元素
            vector<int>::iterator retFind = find(vecWaitPermutaTmp.begin(),vecWaitPermutaTmp.end(),*itNum);
            if(vecWaitPermutaTmp.end() != retFind)
            {
                vecWaitPermutaTmp.erase(retFind);
            }
            //繼續遞歸調用排列算法
            Permutation(vecPermutatedTmp,vecWaitPermutaTmp);
        }
    }
    else //一組排列完畢
    {
        //打印排列結果
        cout<<"\t";
        for(int i = 0; i < vecPermutated.size();++i)
        {
            cout<<vecPermutated.at(i)<<" ";
        }
        cout<<endl;
    }
}

執行結果:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM