枚举排列问题:生成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
代码测试通过
生成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输入方式 } }
相关文章推荐
- 枚举生成可重集排列
- 暴力求解法_枚举排列(生成1~n 的排列,生成可重集的排列,下一个排列)
- 枚举排列----生成可重集的排列
- HDU 4771 Stealing Harry Potter's Precious (生成排列+枚举 + BFS)
- 生成可重集的排列
- 递归枚举,子集生成,排列生成,回溯都是解决解答树的方法
- UVA146生成可重集的下一个排列
- 入门经典 第七章 7.2.2 生成可重集的排列
- 生成可重集的排列
- 生成可重集的排列
- 生成可重集的排列(方法)
- 生成可重集的排列
- 考题一:研究对全排列着色的性质 问题 A: 首先需要生成 n 的全排列然后对 n 的全排列进行着色, 使得相邻的两个数只需用最少颜色就可以把相邻的两个数用那区分开. (这里相邻包含两层含义:同时在自然
- 枚举生成排列的方法总结
- 【枚举排序】生成可重集排序
- 729 - The Hamming Distance Problem(可重集排列,直接枚举)
- 暴力搜索专题小结:全排列及可重集排列生成算法
- [Day 1] 7.2.2 生成可重集的排列(包括利用STL)
- 蓝桥杯C语言培训3 典型问题的递归框架 例题1 排列枚举
- 生成可重集的排列