枚举排列
枚举排列常用的方法有两种:1.递归枚举
2. next_permutation (STL 中的库函数)
例1: 生成1~n的排列
先用递归的思想解决
先输出 所有以1开头的序列 ,然后再输出以2开头的序列,以次类推,最后是以n开头的排列。
以1开头的排列的特点是:
第一位是1,后面是29的排列。29也需要按字典序输出。
所以,所设计的递归函数需要以下参数:
1.已经确定的前缀序列,以便输出。
2.需要进行全排列的元素集合,以便依次选作第一个元素。
/*
用数组表示序列A
A中没有出现的元素 都可以选
还需要一个已经填好的位置个数,当前需要确定的元素个数cur
序列长度n
*/
void print_permutation(int n, int *A, int cur)
{
if(cur==n) // 递归边界 填满就打印
{
for (int i=0;i<n;i++) printf("%d ",A[i]);
printf("\n");
}
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;
}
if(ok)
{
A[cur]=i;
print_permutation(n,A,cur+1); // 递归调用
}
}}
用下next_permutation 函数
#include
#include
using namespace std;
int main()
{
int n,a[11];
while (scanf("%d",&n)!=EOF&&n!=0)
{
for(int i=1;i<=n;i++)
a[i]=i;
do{
for( int i=1;i<=n;i++)
printf("%d ",a[i]);
printf("\n");
}while (next_permutation(a+1,a+n+1));
}
return 0;
}