public boolean generateProblems(Integer[] nums, int start) {
if (start == nums.length) {
return false;
}
for (int i = -range; i < range; i++) {
nums[start] = nums[start] + i;
System.out.println(printArray(nums));
Target game = new Target(nums, target);
if (game.solutionSize() == difficulty) {
if (!possibleGames.contains(game.getValues())) {
possibleGames.add(game.getValues());
}
return false;
}
if (generateProblems(nums, start + 1)) {
return true;
}
nums[start] = nums[start] - i;
}
return false;
}
概述:在游戏中,24,你必须加,减,除,乘四个数才能到达目标,24。我有一个类似的,更抽象的类叫做Target,它取一个整数和数组(并且解决了达到给定目标值的解决方案。
我有另一个名为TargetGenerator的类,它接受“种子数组”,目标值,范围和请求的解决方案数量(难度)。它应该做的是调用方法 generateProblems ,以获得可能的游戏列表,以便此组合仅包含难度解决方案。这些可能的游戏受初始种子数组加上/减去范围的限制。 (种子,{2,3,4,5}范围为3,范围为{-1,0,1,2},但不包括{5,6,7,8}。)
然而,我遇到的问题是我没有血腥的想法为什么这不起作用。 。打印出在控制台中尝试的组合表示它开始正常,但结果不是很好。
种子为{6,2,3,12},目标为24,范围为3:
2 2 3 12
2 -2 3 12
2 -2 -1 12
2 -2 -1 8
2 -2 -1 9
2 -2 -1 10
A few more lines later is where it messes up...
2 1 1 12
2 1 1 13
2 1 2 10
2 1 2 6
2 1 2 7
2 1 3 7
....Few hundred more combinations later...
9 -1 -23 -46
9 -1 -23 -45
9 -1 -23 -44
9 -1 -23 -43
....And now I'm sad :(
在我看来,当它到达“循环”结束时(当start == nums.length时)会发生什么问题,并且当它不应该减去它时会减去。但是,我没有调试技巧来弄清楚什么是错误的。
(如果你们想要的话,我会给出完整的代码)
答案 0 :(得分:1)
我希望它已经不相关了,你自己解决了它,但如果不是,我发现你的功能错了。据我了解,如果您能够达到目标数量,您只需要在给定范围内检查所有可能的组合。如果是这样,你真的不需要从generateProblems中返回任何东西(你可以,但是这样做只会增加复杂性),你只需要检查所有的组合。这就是你如何做到的:
public void generateProblems(Integer[] nums, int start)
{
if (start != nums.length)
{
for (int i = -range; i < range; i++)
{
nums[start] = nums[start] + i;
action(nums);
generateProblems(nums, start + 1);
nums[start] = nums[start] - i;
}
}
}
action(nums);
内部是你的逻辑