生成1~n的排列:
#include <iostream>
#include <cmath>
#include <cstring>
#include <cctype>
#include <algorithm>
#include <stdlib.h>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <sstream>
#define maxn 100
using namespace std;
typedef long long ll;
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++)
{
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);
}
}
}
}
int main()
{
int n,A[maxn];
cin>>n;
print_permutation(n,A,0);
return 0;
}
生成可重集的排列:
注意修改的部分和第28行的判断条件,p是已经从小到大排完序的!
#include <iostream>
#include <cmath>
#include <cstring>
#include <cctype>
#include <algorithm>
#include <stdlib.h>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <sstream>
#define maxn 100
using namespace std;
typedef long long ll;
void print_permutation(int n,int* A,int* p,int cur)
{
if(cur==n)
{
for(int i=0;i<n;i++)
printf("%d ",A[i]);
printf("\n");
}
else
{
for(int i=0;i<n;i++)
{
if(p[i]!=p[i-1]||!i)
{
int c1 = 0, c2 = 0;//c1记录A[0]~A[cur]中p[i]出现的次数,c2记录p数组中p[i]出现的次数
for (int j = 0; j < cur; j++)
if (A[j] == p[i])
c1++;
for (int j = 0; j < n; j++)
if (p[j] == p[i])
c2++;
if (c1 < c2) {
A[cur] = p[i];
print_permutation(n, A, p, cur + 1);
}
}
}
}
}
int main()
{
int n,A[maxn],p[maxn];
cin>>n;
for(int i=0;i<n;i++)
cin>>p[i];
sort(p,p+n);
print_permutation(n,A,p,0);
return 0;
}
输出结果:n=3 ,p[]={2,2,1}时
1 2 2
2 1 2
2 2 1