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