全排列函数:包含两个。
1:next_permutation()函数,作用是输出所有比当前排列 排列大的排列(顺序为由小到大排),求原排列的下一个排列。
next_permutation(a,a+n)函数是对数组a中前n个元素进行全排列
方法1:
#pragma GCC diagnostic error"-std=c++11"
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
string str1;
cin>>str1;
while(next_permutation(str1.begin(),str1.end()))/将全排列的情况全排出来
cout<<str1<<endl;
return 0;
}
//注意:
//1.while(m--){
// next_permutation(a,a+n);/进行m次全排列
//}
//2.#include<bits/stdc++.h>
//using namespace std;
// int main()
//{
//int a[3]={2,1,3};//预先存第三个排列
//prev_permutation(a,a+3); //只是生成下一个排列 ,并不是全部.
//cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<endl;//输出 1 3 2
//return 0;
//}
方法2:
#include<bits/stdc++.h>
using namespace std;
int main(){
char str[100];
cin>>str;
int len=strlen(str);
while(next_permutation(str,str+len)){
cout<<str<<endl;
}
return 0;
}
当输入123时:
2.perv_permutation()函数,作用是输出比当前排列小的排列 (顺序:从大到小),求原排列的上一个排列。
方法1:
#pragma GCC diagnostic error"-std=c++11"
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+9;
int main(){
string str;
cin>>str;
while(prev_permutation(str.begin(),str.end()))
cout<<str<<endl;
return 0;
}
方法2:
#pragma GCC diagnostic error"-std=c++11"
#include<bits/stdc++.h>
using namespace std;
int main()
{
char str[100];
cin>>str;
int len=strlen(str);
while(prev_permutation(str,str+len))
{
cout<<str<<endl;
}
return 0;
}
当输入231时:
3.需要注意:
如果要得到几个数的全排列,需要将数组按升序排列,因为对于next_permutation()函数,它只对比自己大的排列起作用,所以可以对输入的序列进行由小到大的排序,因为最后的总个数不包含第一个最小的那个序列,所以要在最后的总数上加1,才是这几个数进行全排列的结果。
方法1:
#pragma GCC diagnostic error"-std=c++11"
#include<bits/stdc++.h>
using namespace std;
int main()
{
char str[100];
int sum=0;
cin>>str;
int len=strlen(str);
sort(str,str+len);
while(next_permutation(str,str+len))
{
cout<<str<<endl;
sum++;
}
cout<<sum<<endl;
return 0;
}
当输入231时计算机会自动将其从小到大排好序即无论输入多少都是从123开始的,即最小的数开始。
4.输出全排列:
尽量用do while循环,因为第一个排列也要输出:
方法1:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a[3]={
1,2,3};
do
{
cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<endl;
}while(next_permutation(a,a+3));
return 0;
}
5.补充去重写法:
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;
int main()
{
int num[100];
string s;
cin>>s;
int len=s.length();
for(int i=0;i<len;i++)
{
num[i]=s[i]-'0';
}
sort(num,num+len);
do{
for( int i=0;i<len;i++)
{
cout<<num[i];
}
cout<<endl;
}while(next_permutation(num,num+len));
return 0;
} 入代码片
总结:
函数模板:next_permutation(arr, arr+size);
函数模板:prev_permutation(arr, arr+size);
解释:arr为数组,size为数组长度。next_permutation(arr, arr+size);当有下一个较大值返回1,否则返回0,prev_permutation(arr, arr+size);当有上一个较小值返回1,否则返回0。例如:3 2 1,只有上一个较小值,没有下一个较大值。1 2 3只有下一个较大值,没有上一个较小值。2 1 3 的上一个较小值为 1 3 2,下一个较大值为 2 3 1.