import java.io.BufferedInputStream;
import java.util.Scanner;
public class 生成n的排列 {
static int A[] = new int[1 << 7];
static Scanner cin = new Scanner(new BufferedInputStream(System.in));
public static void main(String[] args) {
while (cin.hasNext()) {
int n = cin.nextInt();
print_permutation(n, A, 0);
}
}
private static void print_permutation(int n, int[] A, int cur) {
if (cur == n) {
for (int i = 0; i < n; i++) {
System.out.print(A[i] + " ");
}
System.out.println("");
} 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 == 1) {
A[cur] = i; //赋值当前位置cur
print_permutation(n, A, cur + 1);
}
}
}
}
}
-----------------
package com.supermars.practice;
import java.io.BufferedInputStream;
import java.util.Arrays;
import java.util.Scanner;
public class 生成可重集的排列 {
static int A[] = new int[1 << 7];
static int P[] = new int[1 << 7];
static Scanner cin = new Scanner(new BufferedInputStream(System.in));
public static void main(String[] args) {
while (cin.hasNext()) {
int n = cin.nextInt();
for (int i = 0; i < n; i++) {
P[i] = cin.nextInt();
}
Arrays.sort(P, 0, n);
print_permutation(n, A, P, 0);
}
}
private static void print_permutation(int n, int[] A, int[] P, int cur) {
if (cur == n) {
for (int i = 0; i < n; i++) {
System.out.print(A[i] + " ");
}
System.out.println("");
} else {
for (int i = 0; i < n; i++)
if (P[i] != P[i + 1]) {
int c1 = 0, c2 = 0;
for (int j = 0; j < cur; j++)
// count A[0~cur]重复元素个数
if (P[i] == A[j])
c1++;
for (int j = 0; j < n; j++)
// count P[0~n]重复元素个数
if (P[i] == P[j])
c2++;
if (c1 < c2) {
A[cur] = P[i]; // 赋值当前位置cur
print_permutation(n, A, P, cur + 1);
}
}
}
}
}