1. 程式人生 > >排列組合(Permutations)

排列組合(Permutations)

//排列組合(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