需要帮助找到所有可能的组合,方法几乎完成

时间:2013-09-07 17:11:21

标签: java arrays combinations

我似乎无法使用此代码。我正在做的是用两个数字的所有可能组合填充数组(这些数字中的每一个分别代表形状和颜色)。然后,我试图使用这个数组来填充一个2d数组,其中我创建了前一个数组中所有元素的所有可能组合。出于某种原因,我的2d阵列充满了所有'21'而不是任何组合。

如果需要,我可以在课堂上发布其余的代码,但它相当长。此方法的最后一个循环仅用于打印它们以进行测试,之后将被删除。

public void combinations()
{
    combinations = new int[numShapes*numColors];
    int index = 0;
    for(int l = 1; l <= numShapes; l++)
        for(int h = 1; h <= numColors; h++)
            if(index + 1 != combinations.length + 1)
                combinations[index++] = (l*10) + h;
            else
                break;

    int[][] combs = new int[(int)Math.pow((numShapes*numColors),numPositions)][numPositions];

    //Fills the array with all '21' , fix this
    int ind = 0;
    for(int f = 0; f < 16; f++)
        for(int i = 0; i < numShapes; i++)
            for(int j = 0; j < numColors; j++)
                if(ind != combs.length+1){
                    combs[ind] = new int[]{combinations[numShapes], combinations[numShapes], combinations[numColors]};
                    ind++;
                }
                else
                    break;

    for(int p = 0; p < 2; p++){
        for(int g = 0; g < 3; g++){
            System.out.print(testFormat(combs[p][g]/10, combs[p][g]%10) + " ");
        }
        System.out.println();
    }
}

1 个答案:

答案 0 :(得分:0)

    int[][] combs = combinationsOf(combinations, 5);

    for (int i = 0 ; i < combs.length ; i++)
    {
        for(int j = 0 ; j < combs[i].length ; j++)
        {
            System.out.print(combs[i][j] + ", ");
        }
        System.out.println("");
    }


public static int[][] combinationsOf(int[] colorShape, int numPositions)
{
    int[][] combs = new int[(int)(Math.pow(colorShape.length, numPositions))][numPositions];

    int[] holding = new int[numPositions];
    for(int i = 0 ; i < numPositions ; i++)
    {
        holding[i]=0;
    }

    for(int i = 0 ; i < combs.length ; i++)
    {
        for(int j = 0 ; j < numPositions ; j++)
        {
            combs[i][j] = colorShape[holding[j]];   
        }
        incrementHolding(holding, colorShape.length);
    }
    return combs;
}

public static boolean incrementHolding(int[] holding, int max)
{
    for(int i = holding.length-1 ; i >= 0 ; i--)
    {
        if(holding[i]+1 == max)
        {
            if(i==0)
                return false;
            holding[i]=0;
        }
        else
        {
            holding[i]++;
            return true;
        }
    }
    return true;
}

这对我有用。虽然这是很多代码。运行需要一段时间。

注意:在5个位置,阵列有9,765,625个元素。