本帖最后由 cat73 于 2016-7-6 18:13 编辑
如果只要数量的话,其实可以直接用数学计算求解的。。。
代码随便写写的,效率很低,还很有优化空间。。。
- public static void main(final String args[]) throws Exception {
- new Main()._main(args);
- }
- private void _main(final String args[]) throws Exception {
- int count = this.calc(System.out, new char[] { '1', '2', '3', '4' });
- System.out.println("一共有 " + count + " 种组合.");
- }
- /**
- * @param out 输出每一种可能的组合的流,如不需要输出请设置为 null
- * @param chs 每一个可能的值
- */
- public int calc(final PrintStream out, final char[] chs) {
- // 准备一个数组保存每一位的状态
- final int[] array = new int[chs.length];
- for (int i = 0; i < chs.length; i++) {
- array[i] = 0;
- }
- // 组合数量
- int result = 0;
- // 循环求解
- while (true) {
- // 当前数是否符合规则:每一位上的数字均不同
- boolean ok = true;
- for (int i = 0; i < array.length; i++) {
- for (int j = 0; j < array.length; j++) {
- if (i != j && array[i] == array[j]) {
- ok = false;
- break;
- }
- }
- if (!ok) {
- break;
- }
- }
- // 如果符合规则则将计数器加 1,并输出结果
- if (ok) {
- result += 1;
- if (out != null) {
- final StringBuilder sb = new StringBuilder(array.length);
- for (final int element : array) {
- sb.append(chs[element]);
- }
- out.println(sb.toString());
- }
- }
- // 将第一位加 1,如果第一位已经超过了最大值,则进行进位,如已经没有下一个位用于进位,则返回结果
- array[0] += 1;
- for (int i = 0; i < array.length && array[i] == chs.length; i++) {
- array[i] = 0;
- if (i + 1 < array.length) {
- array[i + 1] += 1;
- } else {
- return result;
- }
- }
- }
- }
复制代码
输出结果:
- 4321
- 3421
- 4231
- 2431
- 3241
- 2341
- 4312
- 3412
- 4132
- 1432
- 3142
- 1342
- 4213
- 2413
- 4123
- 1423
- 2143
- 1243
- 3214
- 2314
- 3124
- 1324
- 2134
- 1234
- 一共有 24 种组合.
复制代码
|