排列:一些元素按某种顺序排成一列即为这些元素的一个排列。例如:由1,2,3,4,5组成一排列可以有12345,31254等。
全排列:一些元素的所有可能的排列。例如:由a,b,c三个字母的全排列为abc,acb,bac,bca,cab,cba六个排列
求全排列的问题可以用递归,也可以用非递归形式。
/*功能:根据输入字符串列全排列 说明1:所用字符为所有可见字符 说明2:区分大小写 说明3:所有字符不重复使用(输入字符串可以重复) 说明4:全排列按字符顺序升序排列*/ #include<iostream> #include<cstring> using namespace std; const int N=20; bool mak[N],m; int a[127],num[N],cnt,no,tmp; char f[N]; void pr() { cout<<++no<<':'; for(int k=1;k<=cnt;k++)cout<<f[num[k]]; cout<<endl; } int main() { ios::sync_with_stdio(0); int i; string s; cin>>s; for(i=0;i<s.length() ;i++)a[s[i]]=1; for(i=33;i<127;i++)if(a[i])f[++cnt]=i; for(i=1;i<=cnt;i++)num[i]=i; pr(); tmp=cnt; do { mak[num[tmp]]=true; for(i=num[tmp]+1;i<=cnt;i++) if(mak[i]) { num[tmp]=i,mak[i]=false; break; } if(i>cnt)tmp--; else { for(i=tmp+1;i<=cnt;i++) for(int j=1;j<=cnt;j++) if(mak[j]) { num[i]=j,mak[j]=false; break; } pr(); tmp=cnt; } }while(tmp); return 0; }
#include<iostream> #include<cstring> using namespace std; int a[27],num[20],mk[20],cnt=0,x,js; char f[20]; void pr() { cout<<++js<<':'; for(int i=1;i<=cnt;i++)cout<<f[num[i]]; cout<<endl; return; } void dfs(int dp) { if(dp==cnt+1)pr(); else for(int i=1;i<=cnt;i++) { if(mk[i]==0) { num[dp]=i,mk[i]=1; dfs(dp+1); mk[i]=0; } } } int main() { ios::sync_with_stdio(0); char ch; string s; cin>>s; for(int i=0;i<s.length() ;i++) { ch=s[i]; if(ch>'Z')ch-=32; x=ch-'A'+1; a[x]=1; } for(int i=1;i<=26;i++)if(a[i])f[++cnt]=i+'A'-1; dfs(1); return 0; }