//排列组合(Permutations)
//a,b,c a,c,b
//b,a,c b,c,a
//c,a,b c,b,a
#include <iostream>
using namespace std;
/*
void Permutations(char *p,const int k,const int m)
{
//a开头的,后面跟着bc的所有排列
swap(p[0],p[0]); //为了与后面构成循环
Permutations(p,1,2);
swap(p[0],p[0]);
//b开头的,后面跟着ac的所有排列
swap(p[0],p[1]);//a和b交换,bac,bca
Permutations(p,1,2);
swap(p[0],p[1]);//a和b再换回来
//c开头的,后面跟着ab的所有排列
swap(p[0],p[2]);//a和c交换
Permutation(p,1,2);
swap(p[0],p[2]);//a和c再换回来
}
*/
void Permutations(char *p,const int k,const int m)
{
if(k==m){
//已经递归到最后一个字符,不需要再递归
for(int i=0;i<=m;i++)
cout<<p[i];
cout<<endl;
}
else{
for(int i=k;i<=m;i++){
swap(p[k],p[i]);//k不变,i是变化的
Permutations(p,k+1,m);
swap(p[k],p[i]);//还原
}
}
}
int main()
{
char s[]="abc";
Permutations(s,0,2);
return 0;
}
//整个过程:
//a_bc
//a与a交换,b与b交换,输出abc
//a与a交换,b与c交换,输出acb
//b_ac
//a与b交换,a与a交换,输出bac
//a与b交换,a与c交换,输出bca
//c_ba
//a与c交换,b与b交换,输出cba
//a与c交换,b与a交换,输出cab