Permutation function

全排列函数:包含两个。
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.

猜你喜欢

转载自blog.csdn.net/weixin_51267249/article/details/113306990