排列:一些元素按某种顺序排成一列即为这些元素的一个排列。例如:由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;
}
来源:https://www.cnblogs.com/wendcn/p/12381543.html