如何使用指定数量的元素创建指定大小的数组的每个版本?
问题描述:
我在问什么是我如何初始化一个指定大小的数组的所有不同变体的列表,并保存指定数量的相同元素?如何使用指定数量的元素创建指定大小的数组的每个版本?
因此,举例来说,可以用这些方式完成包含三个相同元素的大小为5的数组,其中X是元素,O是空白空间。
1) [X, X, X, O, O]
2) [X, X, O, X, O]
3) [X, X, O, O, X]
4) [X, O, X, X, O]
5) [X, O, X, O, X]
6) [X, O, O, X, X]
7) [O, X, X, X, O]
8) [O, X, X, O, X]
9) [O, X, O, X, X]
10) [O, O, X, X, X]
什么算法可以用来创建这种结果?
答
你可以使用递归算法生成所有可能的排列:
public static void main(String[] args) {
ArrayList<char[]> list = new ArrayList<char[]>();
char[] c = {'O', 'O', 'O', 'O', 'O'};
nextArray(list, c, 0, 3);
}
public static void nextArray(List<char[]> list, char[] array, int index, int changes) {
if(index == array.length) return;
if(changes == 0) {
list.add(array);
return;
}
char[] a1 = Arrays.copyOf(array, array.length);
a1[index] = 'X';
nextArray(list, a1, index+1, changes-1);
nextArray(list, Arrays.copyOf(array, array.length), index+1, changes);
}
的想法是在同一时间改变一个指数(跟踪您更改索引的次数),直到changes = 0
。然后添加该数组并终止该递归分支。
看看https://www.nuget.org/packages/Combinatorics/的源代码,它处理所有排列方式和组合(C#) –