您的位置:首页 > 其它

枚举排列问题:生成1-n的排列和可重集排列问题

2013-09-29 17:44 260 查看
问题1:

生成1-n的排列,采用递归,解决思想:先输出所有以1开头的排列,然后输出以2开头的排列....最后输出以n开头的排列

问题2:

输入数组P,并按照字典序输出所有全排列。注意数组P中的数可能重复。修改问题1中代码即可实现。

问题1对应:easyPermutationPrint(int n, int[] A, int cur)函数,问题2:对应peasyPermutationPrint(int n, int[] P, int[] A, int cur) 函数。

Java实现代码如下:

转载时请注明来源:http://blog.csdn.net/ccfeng2008

代码测试通过

package permutation;

import static java.lang.System.out;

import java.util.Arrays;

public class Permutation {

public static void easyPermutationPrint(int n, int[] A, int cur) {
if (cur == n) {
for (int i = 0; i < n; i++) {
if (i == n - 1)
out.println(A[i] + 1);
else
out.print((A[i] + 1) + " ");
}
} else {
for (int i = 0; i < n; i++) {
boolean ok = true;
for (int j = 0; j < cur; j++)
if (A[j] == i)
ok = false;
if (ok) {
A[cur] = i;
easyPermutationPrint(n, A, cur + 1);
}
}
}
}

public static void easyPermutationPrint(int n, int[] P, int[] A, int cur) {
if (cur == n) {
for (int i = 0; i < n; i++) {
if (i == n - 1)
out.println(A[i]);
else
out.print(A[i] + " ");
}
} else {
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];
easyPermutationPrint(n, P, A, cur + 1);
}
}

}
}

public static void main(String[] args) {
// easyPermutationPrint(10, new int[10], 0);//问题1输入方式
int[] p = { 1,2,2 };
Arrays.sort(p);
easyPermutationPrint(p.length, p, new int[p.length], 0);//问题2输入方式
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: