生成数字 1 ~ n的全排列 :
#include<iostream>
#include<cstdio>
using namespace std;
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 A[10];
int main()
{
int n;
cin >> n;
print_permutation(n, A, 0);
return 0;
}
对不含有重复元素的集合进行全排列:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int B[10];
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 = 0; i < n; i++)
{
int ok = 1;
for(int j = 0; j < cur; j++)
if(A[j] == B[i])
ok = 0;
if(ok)
{
A[cur] = B[i];
print_permutation(n, A, cur+1);
}
}
}
}
int main()
{
int n;
int A[10];
cin >> n;
for(int i = 0; i < n; i++)
cin >> B[i];
sort(B, B+n);
print_permutation(n, A, 0);
}
对含有重复元素的集合进行排列:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int B[10];
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 = 0; i < n; i++)
if(!i || B[i] != B[i-1])
{
int c1 = 0, c2 = 0;
for(int j = 0; j < cur; j++) if(A[j] == B[i]) c1++; //统计当前出现的
for(int j = 0; j < n; j++) if(B[i] == B[j]) c2++; //统计总共有的
if(c1 < c2)
{
A[cur] = B[i];
print_permutation(n, A, cur+1);
}
}
}
}
int main()
{
int n;
int A[10];
cin >> n;
for(int i = 0; i < n; i++)
cin >> B[i];
sort(B, B+n);
print_permutation(n, A, 0);
}
生成集合元素的全排列(不断调用下一个排列这个命令)(可适用于含有重复元素和不含重复元素的集合):
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
int n, p[10];
scanf("%d", &n);
for(int i = 0; i < n; i++)
scanf("%d", &p[i]);
sort(p, p+n);
do {
for(int i = 0; i < n; i++)
printf("%d ", p[i]);
printf("\n");
}while(next_permutation(p, p+n));
return 0;
}