让G成为某个对象。
设n = f(G)为集数。
设S i = {1,2,...,h(i) - 1,h(i)},其中1≤i≤n。
我想写一个方法(Java),它返回一个表示笛卡尔乘积的二维数组S = S 1 XS 2 X ... XS n -1 XS n 。该方法的意图在下面的类似Java的伪代码中示出。它意味着一个迭代的解决方案,但递归解决方案也没问题。
int[][] varCart(G, j) {
int[][] result = new int[sizeOfCartProduct][f(G)]
....
return result;
}
此外,S j 更改为{1}(或任何其他单身)。
举个例子:
设G为对象,以便:
f(G)= 3
S 1 = {1,2} [h(1)= 2]
S 2 = {1,2,3} [h(2)= 3]
S 3 = {1,2,3,4} [h(3)= 4]
让j = 2。
然后varCart(G,2)的结果必须是
int [2 * 1 * 4 = 8] [3] = {{1,1,1},{1,1,2},{1,1,3},{1,1,4}, {2,1,1},{2,1,2},{2,1,3},{2,1,4}}
答案 0 :(得分:1)
创建一个每位最大值的数组;在您的示例中,这将是[2,3,4]
将数字j
的最大值设置为1,即可获得[2,1,4]
创建第一个组合[1,1,1]
并将其添加到结果中。然后重复增加组合并将其添加到结果中
要增加组合,请递增最后一位数;如果该数字等于最大值,则将其设置为1
并增加前一个数字,依此类推。如果第一个数字需要递增并且已经设置为最大值,则您已找到所有组合
[1,1,1] -> [1,1,2] -> [1,1,3] -> [1,1,4] -> 4 is maximum for last digit, so set it to 1 and increment previous digit -> 1 is maximum for second digit, so set it to 1 and increment previous digit -> [2,1,1] -> [2,1,2] -> [2,1,3] -> [2,1,4] -> 4 is maximum for last digit, so set it to 1 and increment previous digit -> 1 is maximum for second digit, so set it to 1 and increment previous digit -> 2 is maximum for first digit, so all combinations have been found.