您的位置:首页 > 编程语言

排列组合的代码总结篇

2015-01-09 13:29 246 查看
#include <iostream>
#include <vector>
using namespace std;
void my_swap(vector<char> &a,int i,int j){
int temp=a[i];
a[i]=a[j];
a[j]=temp;
}

vector<char> v;
int n;
void printPremutationRepeat(int pStart,vector<char> temp){
if(pStart==n){
for (int i = 0; i < temp.size(); ++i)
{cout<<temp[i];}
cout<<" ";
return;
}

for (int i = 0; i < 3; ++i)
{
temp.push_back(v[i]);
printPremutationRepeat(pStart+1,temp);
temp.pop_back();
}
}

void printPremutationNoRepeat(int pStart,vector<char> temp){
if(pStart==n){
for (int i = 0; i < temp.size(); ++i)
{cout<<temp[i];}
cout<<" ";
return;
}

for (int i = pStart; i < 3; ++i)
{
my_swap(v,i,pStart);
temp.push_back(v[pStart]);
printPremutationNoRepeat(pStart+1,temp);
temp.pop_back();
my_swap(v,i,pStart);

}
}

/*组合特殊一点,实际这里是两个序列,待选序列v,和n个位置已选的序列。
以n=2为例,即从abcde中选2个字母形成组合。
那么pStart是abcde的指针,
dep是形成的组合temp的指针
这里递归含义:固定第字母a,放在第一个位置,然后对之后的序列再进行组合,即从bcde中选一个
固定第字母b,放在第一个位置,那么就是从cde中选一个
第二次并不是从第0个位置开始,而是从b所在的角标1,开始的,所以pStart的值是i+1

*/
void printCombination(int n,int dep,int pStart,vector<char> temp){
if(dep==n){
for (int i = 0; i < temp.size(); ++i)
{cout<<temp[i];}
cout<<" ";
return;
}

for (int i = pStart; i < 3; ++i)
{
temp.push_back(v[i]);
printCombination(n,dep+1,i+1,temp);

temp.pop_back();
}
}

int main(){

v.push_back('a');
v.push_back('b');
v.push_back('c');
n=v.size();
vector<char> temp;
cout<<"abc的可重复全排列是:"<<endl;
printPremutationRepeat(0,temp);
cout<<endl;
cout<<"abc的全排列是:"<<endl;
printPremutationNoRepeat(0,temp);
cout<<endl;
cout<<"abc的组合是:"<<endl;
for (int i=1; i<=3; ++i) {
printCombination(i,0,0,temp);
}
cout<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: