1.生成1~n的全排列
第一种方式:
void permutation(int a[], int n, int cur) { //数组a不用初始化
if(cur == n) {
for(int i = 0; i < n; i++) {
cout << a[i] << " ";
}
cout << "\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; //如果i已经在a[0]~a[cur-1]出现过,则不可再选
}
if(ok) {
a[cur] = i;
permutation(a, n, cur+1); //递归调用
}
}
}
第二种方式(交换的思想):
void permutation(int a[], int n, int cur) {
if(cur == n) {
for(int i = 0; i < n; i++) {
cout << a[i] << " ";
}
cout << "\n";
}
else for(int i = cur; i < n; i++) {
swap(a[cur], a[i]);
permutation(a, n, cur+1);
swap(a[cur], a[i]);
}
}
2.生成可重集全排列
void permutation(int a[], int p[], int n, int cur) {
if(cur == n) {
for(int i = 0; i < n; i++) {
cout << a[i] << " ";
}
cout << "\n";
}
for(int i = 0; i < n; i++) {
if(i == 0 || p[i] != p[i-1]) {
int c1 = 0, c2 = 0;
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];
permutation(a, p, n, cur+1);
}
}
}
}
当然生成这两种排列都可以用STL库的next_permutation()函数(头文件algorithm):
int a[4] = {1,2,3,4}, n = 4;
do{
for(int i = 0; i < n; i++) {
cout << a[i] << " ";
}
cout << "\n";
}while(next_permutation(a, a+4));