枚举排列的常见方法有两种:
一是递归枚举,
二是用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;
}