import java.util.Arrays;
import java.util.Scanner;
/*枚举排列 : 递归枚举数组p中所有元素的排列
* 注意事项:欲保证对于重复的元素相同的排列只生成一次 在排列前需要先对数组排序*/
public class Permutation {
static final int MAXN = 20;
int[] a = new int[MAXN];
int[] p = new int[MAXN];
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Permutation pp = new Permutation();
int n;
while ((n = scanner.nextInt()) > 0) {
for (int i = 0; i < n; i++)
pp.p[i] = scanner.nextInt();
Arrays.sort(pp.p,0,n);
pp.print_permutation(n, 0);
}
}
private void print_permutation(int n, int cur) {// n表示数组大小 cur表示当前处理位置
int i = 0;
if (cur == n) {//所有元素都已选择 输出
for (i = 0; i < n; i++) {
System.out.printf("%d ", a[i]);
}
System.out.println();
} else {
for (i = 0; i < n; i++)// 在a[cur]中尝试填写各p[i]值
if (i == 0 || p[i] != p[i - 1])// 在这里添加判断 跳过添加重复值到目前处理位置上
{
int c1 = 0, c2 = 0;
for (int j = 0; j < cur; j++)
// 统计a[0...cur]中p[i]出现的次数
if (a[j] == p[i])
c1++;
for (int j = 0; j < n; j++)
// 统计p中p[i]出现的次数
if (p[i] == p[j])
c2++;
if (c2 > c1) {// 如果p[i]在a[0...cur]出现的次数还未达到(但是如果仅仅这么控制
//那么(1 1 1)的排列将会达到27次)
a[cur] = p[i];
print_permutation(n, cur + 1);
}
}
}
}
}
全排列(允许有重复元素)
最新推荐文章于 2021-02-18 18:24:10 发布