1

我确定我想要完成的任务有一个 CS 术语,但我不确定它是什么。我有三个数组,我们称它们a为 、bc。我正在遍历数组的所有可能组合,这将是a*b*c迭代。

我正在传递int当前迭代的函数 an(例如iteration0到 )以及、和a*b*c-1的长度。我希望该函数能够打印出索引的每个唯一排列,仅根据迭代次数和 、 和 的长度计算得出。abcabc

这就是我现在所拥有的:

class Test {
    public static void printIndices(int i, int a, int b, int c) {
        System.out.println(i%a + ", " + (i+1)%b + ", " + (i+2)%c);
    }

    public static void main(String[] args) {
        int a[] = new int[2];
        int b[] = new int[2];
        int c[] = new int[3];

        int iterations = a.length * b.length * c.length;

        for (int i=0; i < iterations; i++){
            printIndices(i, a.length, b.length, c.length);
        }
    }
}

它生成以下输出:

0, 1, 2
1, 0, 0
0, 1, 1
1, 0, 2
0, 1, 0
1, 0, 1
0, 1, 2
1, 0, 0
0, 1, 1
1, 0, 2
0, 1, 0
1, 0, 1

如您所见,有重复项。我希望输出为:

0, 0, 0
1, 0, 0
0, 1, 0
1, 1, 0
0, 0, 1
1, 0, 1
0, 1, 1
1, 1, 1
0, 0, 2
1, 0, 2
0, 1, 2
1, 1, 2

(顺序并不重要,只要每个排列都没有重复)。

显然我的输出行是错误的:

System.out.println(i%a + ", " + (i+1)%b + ", " + (i+2)%c);

获得我正在寻找的输出的正确操作是什么?

我知道这段代码看起来有点傻,这根本不是我实际在做的事情,但它很好地展示了这个案例。

4

1 回答 1

4

如评论中所述,您正在寻找笛卡尔积

您使用模块化算术的方法几乎可行。您只需要进行一些修改即可获得正确的结果:

System.out.println(i%a + ", " + (i/a)%b + ", " + (i/a/b)%c);

在线查看它:ideone

于 2012-06-18T17:24:51.393 回答