#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;
}