枚举排列的两种方式(递归枚举和STL的next_permutation)

枚举排列的常见方法有两种:

一是递归枚举,

二是用STL中的 next_permutation.

一、递归枚举:

对于生成1~n的排列

思路:用递归的思想解决:先输出所有以1开头的排列(这一步是递归调用),然后 输出以2开头的排列(又是递归调用),接着是以3开头的排列……最后才是以n开头的排 列。以1开头的排列的特点是:第一位是1,后面是2~9的排列。根据字典序的定义,这些2 ~9的排列也必须按照字典序排列。换句话说,需要“按照字典序输出2~9的排列”,不过需 注意的是,在输出时,每个排列的最前面要加上“1”。(算法设计刘汝佳)

代码如下:

#include <iostream>
using namespace std;
int a[10005];
void dfs(int n,int a[],int cur)//
{
	if(cur==n)//递归边界 
	{
		for(int i=0;i<n;i++)
		cout<<a[i]<<" ";
		cout<<endl; 
	}
	else for(int i=1;i<=n;i++)//尝试在A[cur]中填各种整数i
	{
		int ok=1;
		for(int j=0;j<cur;j++)
			if(a[j]==i) ok=0;//如果i已经在A[0]~A[cur-1]出现过,则不能再选
		if(ok)
		{
			a[cur]=i;
			dfs(n,a,cur+1);
		}
	}
}
int main()
{//求1~n的全排列
	int n;cin>>n;
	for(int i=0;i<n;i++) a[i]=i+1;
	dfs(n,a,0);
	return 0; 
}

二、是用STL中的 next_permutation

next_permutation是一个c++函数,包含在头文件< algorithm>里面,下面是基本格式。

next_permutation(a,a+n);  //a为一个按字典序从小到大的数组。

对于生成1~n的排列

代码如下

#include <iostream>
#include <algorithm>//包含next_permutation
using namespace std;
int a[10005];
int main()
{
	int n;
	cin>>n;
	for(int i=0;i<n;i++) a[i]=i+1;
	//注意a一定要按字典序从小到大排序 ,如果不是,用sort(a,a+n)调整好再用 next_permutation
	do
	{
		for(int i=0;i<n;i++)
		cout<<a[i]<<" ";
		cout<<endl;
	}while(next_permutation(a,a+n));//求下一个全排列 	
	return 0; 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值