//问题:生成1~n的全排列
#include "stdio.h"
#define MAX_LENGTH 20
int num[MAX_LENGTH];
void permutation (int cur,int n) {
if (cur >= n) {
int i = 0;
while (i < n) {
printf ("%d ",num[i]);
i++;
}
printf ("\n");
}else {
int i;
int j;
for (i = 1;i <= n;i++) {
int flag = 1;
for (j = 0;j < cur;j++) {
if (num[j] == i) {
flag = 0;
break;
}
}
if (flag) {
num[cur] = i;
permutation (cur+1,n);
}
}
}
}
//如果个数很少的情况可以改成 。以n = 3为例
int check (int number,int cur) {
int i;
for (i = 0;i < cur;i++) {
if (number == num[i]) {
return 0;
}
}
return 1;
}
void permutation2 (int cur) {
if (cur >= 3) {
int i = 0;
while (i < 3) {
printf ("%d ",num[i]);
i++;
}
printf ("\n");
}else {
int ok = check (1,cur);
if (ok) {
num[cur] = 1;
permutation2 (cur+1);
}
ok = check (2,cur);
if (ok) {
num[cur] = 2;
permutation2 (cur+1);
}
ok = check (3,cur);
if (ok) {
num[cur] = 3;
permutation2 (cur+1);
}
}
}
int main () {
permutation (0,3);//n = 3
printf ("---hr--\n");
permutation2 (0);
return 0;
}
生成可重集的排列
#include "stdio.h"
#define MAX_LENGTH 20
int arr1[MAX_LENGTH];
int arr2[MAX_LENGTH];
void permutation (int cur,int n) {
if (cur >= n) {
int i = 0;
while (i < n) {
printf ("%d ",arr2[i]);
i++;
}
printf ("\n");
}else {
int i;
int j;
for (i = 0;i < n;i++) {
if (i == 0 || arr1[i] != arr1[i-1]) {
int c1 = 0;
int c2 = 0;
for (j = 0;j < cur;j++) {
if (arr1[i] == arr2[j]) {
c1++;
}
}
for (j = 0;j < n;j++) {
if (arr1[j] == arr1[i]) {
c2++;
}
}
if (c1 < c2) {
arr2[cur] = arr1[i];
permutation (cur+1,n);
}
}
}
}
}
int main () {
int n;
int i;
scanf ("%d",&n);
for (i = 0;i < n;i++) {
scanf ("%d",arr1+i);
}
permutation (0,n);
return 0;
}