全排列问题 Java代码实现

给n个数字,在给一个m,写出这n个数字的全排列,其中临近的两个数字和不能超过m。

考虑使用递归的方法实现全排列,通过数据交换的方式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49

import java.util.Arrays;
import java.util.Scanner;

/**
* Created by 90684 on 2018/6/14.
*/
// 题目:给n个数字,在给一个m,写出这n个数字的全排列,其中临近的两个数字和不能超过m。

// 题解:采用递归的方法,数据交换
public class test1 {
public static void permute(int[] array, int start, int k) {
boolean flag = true;
if (start == array.length) { // 输出
for (int i = 0; i < array.length - 1; i++) {
if ((array[i] + array[i + 1]) > k) {
flag = false;
break;
}
}
if (flag == true) {
System.out.println(Arrays.toString(array));
}

} else
for (int i = start; i < array.length; ++i) {
swap(array, start, i); // 交换元素
permute(array, start + 1, k); //交换后,再进行全排列算法
swap(array, start, i); //还原成原来的数组,便于下一次的全排列
}
}

private static void swap(int[] array, int s, int i) {
int t = array[s];
array[s] = array[i];
array[i] = t;
}

public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] num = new int[n];
for (int i = 0; i < n; i++) {
num[i] = sc.nextInt();
}
int k = sc.nextInt();
permute(num, 0, k);
}
}
-------------The End-------------