标签:
今天突然想到一个问题,有时候,针对同一个事件有多种反映,特别是游戏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; } }
执行结果:
标签:
原文地址:http://www.cnblogs.com/knight-monkey/p/Monkey_blog_201507031706.html