在Java中,如何生成NxM布尔数组的所有可能组合?
我正在尝试创建一个函数来计算2D NxM数组的所有可能的NxM组合。它可以包含1到N之间的任意两个整数(因此对1x1,2x2,1x2,2x1,…NxM执行此操作应该是可能的)。我一直在尝试不同的解决方案,但似乎无法全部计算出来。以下是我到目前为止的情况:在Java中,如何生成NxM布尔数组的所有可能组合?,java,arrays,2d,combinations,Java,Arrays,2d,Combinations,我正在尝试创建一个函数来计算2D NxM数组的所有可能的NxM组合。它可以包含1到N之间的任意两个整数(因此对1x1,2x2,1x2,2x1,…NxM执行此操作应该是可能的)。我一直在尝试不同的解决方案,但似乎无法全部计算出来。以下是我到目前为止的情况: private static void computeGrid(int[][] B) { computeGrid(B,0,0); } private static void computeGrid(in
private static void computeGrid(int[][] B) {
computeGrid(B,0,0);
}
private static void computeGrid(int[][] B, int x, int y) {
print(B);
int[][] B0x = copy2DArray(B);
int[][] B0y = copy2DArray(B);
int[][] B1x = copy2DArray(B);
int[][] B1y = copy2DArray(B);
if(x+1 < B0x.length) {
B0x[x][y] = 0;
computeGrid(B0x, x+1,y);
}
if(y+1 < B0y[0].length) {
B0y[x][y] = 0;
computeGrid(B0y, x, y+1);
}
if(x+1 < B1x.length) {
B1x[x][y] = 1;
computeGrid(B1x, x+1, y);
}
if(y+1 < B1y[0].length) {
B1y[x][y] = 1;
computeGrid(B1y, x, y+1);
}
}
然而,我得到的是:
{{0,0},{0,0}},
{{0,0},{1,0}},
{{0,1},{0,0}},
{{1,0},{0,0}},
{{1,0},{1,0}},
{{1,1},{0,0}}
如何计算所有的组合?如果你仔细想想,你可以看到一个矩阵是一个一维列表,其中每个元素都有位置
m*N+N
m
是行的索引,n
是行中的索引,n
是行中元素的数量
将矩阵视为一个列表将问题简化为获取大小为M*N
且仅包含0
s和1
s的列表的所有变体(2^(M*N))
我们可以利用递归,通过递归地将0
s和1
s添加到每个变体中,来获得所有变体。递归从一个空列表开始。然后复制列表。将0
添加到原始列表中,并将1
添加到复制的列表中。当我们对结果列表重复这个过程,直到它们达到M*N
,我们得到了一组变体
当我们有这些变体时,我们可以从中得到数组,其中每个数组都是矩阵变体中的一行。我们可以从变量列表中的位置获取元素所属行的索引和行中位置的索引
在这里,我实现了该算法:
import java.util.ArrayDeque;
导入java.util.array;
导入java.util.Deque;
班长{
静态void addVariations(Deque堆栈、int[]变量、int索引){
如果(索引>=0){
//下一个递归的克隆
int[]variationClone=variation.clone();
//一个得到0,另一个在索引处得到1
变异[指数]=0;
variationClone[索引]=1;
//下一个递归
添加变量(堆栈、变量、索引-1);
addVariations(堆栈、variationClone、索引-1);
}
否则{
堆栈推送(变化);
}
}
静态数据变量(int M,int N){
int variationLength=M*N;
//获取矩阵所基于的所有变体
//其中有n^r,2^variationLength
Deque变体=新的ArrayDeque();
addVariations(variations,新整数[variationLength],variationLength-1);
//生成矩阵的容器
Deque VariationMatrix=新的ArrayDeque();
//对于每个矩阵
对于(int i=variations.size()-1;i>=0;i--){
int[][]矩阵=新的int[N][M];
int[]variation=variations.pop();
//为每行添加部分变量
对于(int j=0;j{
System.out.println(“---”);
对于(int i=0;i
是否仅限于c型数组?N是否总是大于或等于M?@NomadMaker“1x1,2x2,1x2,2x1,…NxM应该是可能的”我没有这样想过。非常感谢你!
{{0,0},{0,0}},
{{0,0},{1,0}},
{{0,1},{0,0}},
{{1,0},{0,0}},
{{1,0},{1,0}},
{{1,1},{0,0}}