当然,最好用的还是STL的next_permutation(a,a + n)
#include <iostream>
using namespace std;
void print_permutation_1n(int n,int cur,int *a)//生成1-n的全排列
{
if (cur == n) {//递归出口
for(int i = 0;i < n;i ++) printf("%d",a[i]);
printf("\n");
}
else {
for (int i = 1; i <= n; i ++) {//i是下一个要加入的数
int ok = 1;
for (int j = 0; j < cur; j ++) {
if (a[j] == i) {//如果之前已经使用过,则不能再加入
ok = 0;
}
}
if (ok) {
a[cur] = i;//加入i
print_permutation_1n(n, cur + 1, a);
}
}
}
}
void print_permutation_p(int n,int cur,int *a,int *p)//生成给定序列的全排列(可能有重复元素)
{
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(!i || p[i] != p[i - 1]){//不重复
int c1 = 0,c2 = 0;
for (int j = 0; j < cur; j ++) {//记录第j个元素在a中已经出现的次数
if (p[i] == a[j]) {
c1 ++;
}
}
for (int j = 0; j < n; j ++) {//记录第j个元素在p中出现的次数
if (p[i] == p[j]) {
c2 ++;
}
}
if (c1 < c2) {
a[cur] = p[i];
print_permutation_p(n, cur + 1, a,p);
}
}
}
}
}
int main()
{
int a[10];
int p[4] = {1,1,2,3};
print_permutation_1n(4, 0, a);
print_permutation_p(4, 0, a,p);
return 0;
}