今天突然想到一個問題,有時候,針對同一個事件有多種反映,特別是游戲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;
}
}
執行結果:
