全排列问题
1.
next_permutation:求下一个排列组合
函数模板:next_permutation(arr, arr+size);
参数说明:
arr: 数组名
size:数组元素个数
函数功能: 返回值为bool类型,当当前序列不存在下一个排列时,函数返回false,否则返回true,排列好的数在数组中存储
.
注意:在使用前需要对欲排列数组按升序排序,否则只能找出该序列之后的全排列数。比如,如果数组num初始化为2,3,1,那么输出就变为了:{2 3 1} {3 1 2} {3 2 1}
2.
递归求解
设R={r1,r2,…,rn}是要进行排列的n个元素,Ri=R-{ri}。
集合X中元素的全排列记为perm(X)。
(ri)perm(X)表示在全排列perm(X)的每一个排列前加上前缀得到的排列。
R的全排列可归纳定义如下:
当n=1时,perm(R)=(r),其中r是集合R中唯一的元素;
当n>1时,perm(R)由(r1)perm(R1),(r2)perm(R2),…,(rn)perm(Rn)构成。
实现思想:将整组数中的所有的数分别与第一个数交换,这样就总是在处理后n-1个数的全排列。
【示例】
当n=3,并且E={a,b,c},则:
perm(E)=a.perm({b,c}) + b.perm({a,c}) + c.perm({a,b})
perm({b,c})=b.perm(c) + c.perm(b)
a.perm({b,c})=ab.perm(c) + ac.perm(b)
=ab.c + ac.b=(abc, acb)
1.#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<algorithm>
using namespace std;
int main(){
string str;
while(cin>>str){
sort(str.begin(),str.end());
do{
cout<<str<<endl;
}while(next_permutation(str.begin(),str.end()));
}
return 0;
}
2.
//留一个小问题,此方法发现不能按字典序排列是为什么 ,比如dbc
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<stack>
#include<vector>
using namespace std;
string str;
void Perm(string s,int k, int m )
{ //产生[list[k:m]的所有排列
if(k==m)
{ //只剩下一个元素
cout<<s<<endl;
}
else //还有多个元素待排列,递归产生排列
for (int i=k; i<=m; i++)
{
swap(s[k],s[i]);
Perm(s,k+1,m);
swap(s[k],s[i]);
}
}
int main(){
while(cin>>str){
sort(str.begin(),str.end());
Perm(str,0,str.size()-1);
}
return 0;
}