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

问题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.youkuaiyun.com/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输入方式
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值