我将寻求您最好的建议和建议。我对不同的盒子和物体有问题。
让我解释一下:例如,我有2个盒子和3个物体。所以我用2 ^ 3 = 8种可能的解决方案来计算所有解决方案。方框列表{-1, 0}
。对象列表{0, 1, 2}
。
我对一个解决方案的表示:一个数组[objects.length]
1 solution : [-1,-1,-1];
2 solution : [0,-1,-1];
3 solution : [-1,0,-1];
4 solution : [-1,-1,0];
5 solution : [0,0,-1];
6 solution : [-1,0,0];
7 solution : [0,-1,0];
8 solution : [0,0,0];
现在我提出的算法不起作用:
Array box = {-1, 1}
Array object = {0, 1, 2}
Array solutions = {}
// INITIALISATION
Stack sbox = box;
Stack sobject = object;
WHILE sobject not empty DO
object = Pop sobject;
FOR i from 0 to box.length DO
solution[object] = box[i];
FIN POUR
END WHILE
但是这个解决方案不正确,因为我只有6个解决方案。
您能帮我提供不同的文件或建议吗?感谢。
答案 0 :(得分:2)
我不知道为什么你的盒子数组是{-1,0},无论如何下面的代码都有效。你只需要一个基数(方框数)然后一遍又一遍地除去排列的总数。在你的情况下,你有2 ^ 3 = 8个解,你的基数是2,你在外循环中尝试0,1,2,.. 7,并在内循环中除以基数。
int[] box = {-1, 0};
int objects = 3;
int total = (int) Math.pow(box.length, objects);
int radix = box.length;
for (int i = 0; i < total; i++) {
int v = i;
for (int pos = 0; pos < objects; pos++) {
System.out.print(box[v % radix] + " ");
v = v / radix;
}
System.out.println();
}
这样,当你有很多盒子时,你可以避免大堆栈(递归也需要堆栈)。在更复杂的情况下,你可以有多个基数,例如。对于第一个框,允许项目A和B,对于第二个框,允许B,C和D.
答案 1 :(得分:1)
给你的方框数字0 ... n
对象数量:m
您可以简单地将数字计入基数n并使用结果数字来确定放置每个对象的框。只需从0
计算到m^n-1
即可获得所有组合。
框3的示例数,对象数4
0000 all in boy 0
0001 fist three in box 0 last one in box 1
0002
0010
0011
0012
0020 fist two in box 0, third one in box 2 and last one in box 0
...
2210 fist two in box 2, third one in box 1 and last one in box 0
2211
2212
2220
2221
2222
这样您就可以获得所有m^n
种可能的组合。
答案 2 :(得分:1)
最简单的解决方案可能是递归函数。
基本上,对于每个索引(对象),尝试所有可能的元素(框),然后递归到下一个索引。
box = {-1, 0}
objectCount = 3
solutions = {}
getPermutations(0, new array[objectCount]) // function call
getPermutations(index, output)
if index == output.length
solutions.add(output)
else
for each box b
output[index] = b
getPermutations(index + 1, output)