本帖最后由 cat73 于 2016-8-2 23:11 编辑
[Java] 纯文本查看 复制代码 import java.util.Arrays;
public final class Main {
public static void main(final String[] args) {
Main.traverse(new Character[] { 'A', 'B', 'C', 'D', 'E' }, 0, chars -> {
// 第三位不能为 D
if (chars[2].equals('D')) {
return;
}
// C 跟 E 不能相邻
if (Math.abs(Main.indexOf(chars, 'C') - Main.indexOf(chars, 'E')) == 1) {
return;
}
// 输出结果
System.out.println(Arrays.toString(chars));
});
}
/**
* 遍历几个元素的所有可能的组合
*
* @param array 元素列表
* @param index 请传 0
* @param out 结果输出的接口
*/
public static <T> void traverse(final T[] array, final int index, final TraverseOut<T> out) {
if (index == array.length - 1) {
out.invoke(array);
} else {
for (int index2 = index; index2 < array.length; index2++) {
Main.swap(array, index, index2);
Main.traverse(array, index + 1, out);
Main.swap(array, index, index2);
}
}
}
/**
* 交换数组中的两个元素
*
* @param array 数组
* @param index1 元素 1 的位置
* @param index2 元素 2 的位置
*/
public static <T> void swap(final T[] array, final int index1, final int index2) {
final T t = array[index1];
array[index1] = array[index2];
array[index2] = t;
}
/**
* 在数组中搜索指定元素
*
* @param array 数组
* @param key 目标元素
* @return 元素所在的位置,如果未找到则返回 -1
*/
public static <T> int indexOf(final T[] array, final T key) {
for (int i = 0; i < array.length; i++) {
if (array[i] == key) {
return i;
}
}
return -1;
}
/**
* 遍历结果输出的接口
*
* @author cat73
*/
@FunctionalInterface
public static interface TraverseOut<T> {
void invoke(T[] t);
}
}
输出:
- [A, B, C, D, E]
- [A, B, E, D, C]
- [A, C, B, D, E]
- [A, C, B, E, D]
- [A, D, C, B, E]
- [A, D, E, B, C]
- [A, E, B, D, C]
- [A, E, B, C, D]
- [B, A, C, D, E]
- [B, A, E, D, C]
- [B, C, A, D, E]
- [B, C, A, E, D]
- [B, D, C, A, E]
- [B, D, E, A, C]
- [B, E, A, D, C]
- [B, E, A, C, D]
- [C, B, A, D, E]
- [C, B, A, E, D]
- [C, B, E, D, A]
- [C, B, E, A, D]
- [C, A, B, D, E]
- [C, A, B, E, D]
- [C, A, E, D, B]
- [C, A, E, B, D]
- [C, D, A, B, E]
- [C, D, A, E, B]
- [C, D, B, A, E]
- [C, D, B, E, A]
- [C, D, E, B, A]
- [C, D, E, A, B]
- [D, B, C, A, E]
- [D, B, E, A, C]
- [D, C, B, A, E]
- [D, C, B, E, A]
- [D, C, A, B, E]
- [D, C, A, E, B]
- [D, A, C, B, E]
- [D, A, E, B, C]
- [D, E, A, C, B]
- [D, E, A, B, C]
- [D, E, B, A, C]
- [D, E, B, C, A]
- [E, B, C, D, A]
- [E, B, C, A, D]
- [E, B, A, D, C]
- [E, B, A, C, D]
- [E, D, C, B, A]
- [E, D, C, A, B]
- [E, D, B, C, A]
- [E, D, B, A, C]
- [E, D, A, B, C]
- [E, D, A, C, B]
- [E, A, C, D, B]
- [E, A, C, B, D]
- [E, A, B, D, C]
- [E, A, B, C, D]
复制代码
|