如何使用指定数量的元素创建指定大小的数组的每个版本?

问题描述:

我在问什么是我如何初始化一个指定大小的数组的所有不同变体的列表,并保存指定数量的相同元素?如何使用指定数量的元素创建指定大小的数组的每个版本?

因此,举例来说,可以用这些方式完成包含三个相同元素的大小为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] 

什么算法可以用来创建这种结果?

+0

看看https://www.nuget.org/packages/Combinatorics/的源代码,它处理所有排列方式和组合(C#) –

你可以使用递归算法生成所有可能的排列:

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。然后添加该数组并终止该递归分支。

+0

有没有办法让我修改这个,所以如果有的话不仅仅是空的空间,而且还有必须避免的填充空间也可以做到。 – Ethan722

+0

@ Ethan722你是什么意思? – Maljam

+0

所以要改变我原来的例子,它将是一个数组,当空的时候看起来像[O,O,O,1,O]所以只有[X,X,X,1,O],[X,X,O, 1,X],[X,O,X,1,X]和[O,X,X,1,X]将起作用。基本上,你必须避免某个角色,因为你发现你的排列。 – Ethan722