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); } } } } }
全排列(允许有重复元素)
最新推荐文章于 2020-09-13 15:52:15 发布