根据《入门经典》和一些资料,总结了全排列问题,下面贴些代码,不在作详细说明,欢迎补充~
①利用递归
#include<iostream>
using namespace std;
void print_permutation(int n,int *a,int cur) //n为待排列元素个数,a为储存数组,cur为已排列元素个数
{
if(cur==n) //直接输出
{
for(int i=0;i<n;i++)
cout<<a[i];
cout<<endl;
}
else
for(int i=1;i<=n;i++) //依次由小到大循环
{
int ok=1;
for(int j=0;j<cur;j++)
if(i==a[j])
ok=0;
if(ok)
{
a[cur]=i;
print_permutation(n,a,cur+1); //递归调用
}
}
}
int main()
{
int n;
cin>>n;
int a[10];
for(int i=0;i<n;i++)
cin>>a[i];
print_permutation(n,a,0);
return 0;
}
②利用自带函数
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n;
char p[10];
cin>>n;
for(int i=0;i<n;i++)
cin>>p[i];
sort(p,p+n);
do
{
for(int i=0;i<n;i++)
cout<<p[i]<<" ";
cout<<endl;
}while(next_permutation(p,p+n));
return 0;
}
注:
1.包含头文件algorithm,才可用sort排序和next_permutation()
2.next_permutation()是下一个排列的意思,也就是字典序中的下一个,所以要想实现全排,要不开始时加个sort()排序,使之由小到大,要不输入时直接由小到大。
3.prev_permutation()是上一个排列,所以只需由大到小输入即可实现全排。
另:有关字符串,大同小异
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int main()
{
string s1;
cin>>s1;
sort(s1.begin(),s1.end());
while(next_permutation(s1.begin(),s1.begin()+s1.size()))
cout<<s1<<endl;
return 0;
}