组合益智游戏

时间:2011-05-06 06:12:12

标签: algorithm combinations

我想知道解决以下问题的最佳方法是:

我现在有Map<String, Collection<String>>。让我们说一下用餐时可以提供的一系列饮料。 E.g。

早餐 - 橙汁 早餐 - 咖啡

午餐 - 橙汁 午餐 - 苏打水 午餐 - 啤酒

晚餐 - 苏打水 晚餐 - 啤酒 晚餐 - 葡萄酒

所以我的收藏真的是Map<Meal, Collection<Beverage>>

我需要做的是在膳食中创建所有各种饮料组合的List<Map<String,String>>。在这种情况下,我将有18种组合。 E.g。

[

[ 早餐 - &gt;橙汁, 午餐 - &gt;橙汁, 晚餐 - &gt;苏打 ]

[ 早餐 - &gt;橙汁, 午餐 - &gt;橙汁, 晚餐 - &gt;啤酒 ]

[ 早餐 - &gt;橙汁, 午餐 - &gt;橙汁, 晚餐 - &gt;葡萄酒 ]

[ 早餐 - &gt;橙汁, 午餐 - &gt;苏打, 晚餐 - &gt;苏打, ]

...等 ]

我很想知道其他人如何创建最终的系列。

另外,我正在使用java,所以很好的功能是不受限制的。

由于

修改

膳食类型是动态的。也就是说,可以从列表中删除晚餐或添加早午餐。

2 个答案:

答案 0 :(得分:1)

如果我做对了,这里没有魔法,只需在嵌套循环中迭代3个集合。

for (String breakfastBev : breakfast) {
  for (String lunchBev : lunch) {
    for (String dinnerBev : dinner) {
      System.out.println(breakfastBev + ", " + lunchBev + ", " + dinnerBev);
    }
  }
}

我相信您现在可以了解如何使用Map和输出List来完成此操作。 : - )

编辑:对于更改的要求,一种方法是递归:

main() {
    List<Map<String, String>> output = new ArrayList<Map<String, String>>();
    recordBeverages(new HashMap(), beveragesByMeal, output);
}

void recordBeverages(Map visited, Map meals, List<Map> output) {
    if(meals.isEmpty()) {
        output.add(visited);
    }
    String mealType = meals.keySet().iterator().next();
    Map remainingMeals = new HashMap(visited);
    remainingMeals.keySet().remove(mealType);
    for(Beverage bev : meals.get(mealType)) {
        Map newVisited = new HashMap(visited);
        newVisited.put(mealType, bev);    

        recordBeverages(newVisited, remainingMeals, output);
    }
}

没有经过测试,但你明白了。

答案 1 :(得分:0)

使用一组计数器,其中包含尽可能多的计数器。在循环中增加第一个,直到它达到第一餐的最后一个饮料,然后增加下一个(逐渐减少)。当达到最后一餐的最后一餐时,你就完成了。

我会把代码留给你。