algorithm - 组合益智游戏

标签 algorithm combinations

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

我现在有一个Map<String, Collection<String>> .假设它是一张膳食 map ,其中包含您可以在该膳食中提供的一系列饮料。例如

早餐 - 橙汁 早餐 - 咖啡

午餐 - 橙汁 午餐 - 汽水 午餐 - 啤酒

晚餐 - 汽水 晚餐 - 啤酒 晚餐 - Wine

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

我需要做的是创建一个 List<Map<String,String>>用餐时的所有各种饮料组合。在这种情况下,我将有 18 种组合。例如

[

[ 早餐 -> 橙汁, 午餐 -> 橙汁, 晚餐 -> 汽水 ]

[ 早餐 -> 橙汁, 午餐 -> 橙汁, 晚餐 -> 啤酒 ]

[ 早餐 -> 橙汁, 午餐 -> 橙汁, 晚餐 -> Wine ]

[ 早餐 -> 橙汁, 午餐 -> 苏打水, 晚餐 -> 苏打水, ]

等等... ]

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

另外,我使用的是 java,所以漂亮的功能性东西是禁止使用的。

谢谢

编辑

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

最佳答案

如果我做对了,这里没有魔法,只需在嵌套循环中迭代 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);
    }
}

未经测试,但您明白这一点。

关于algorithm - 组合益智游戏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5907474/

相关文章:

algorithm - 使用最少给定的矩形覆盖折线,同时保持其连续性

python - 创建一组的所有组合并耗尽内存

python - Itertools - 合并两个列表以获得所有可能的组合

php - 寻找 Jenks 优化——数据分类

algorithm - 如何操纵围绕中心值震荡的价格序列(指标)?

c++ - 具有 O(1) 插入(分摊)和 O(n) 迭代的容器

algorithm - 如何构造具有任何连续数字的唯一总和的正整数序列?

algorithm - 使用 2 个数字求和的方法数

python - 如何在 python 中高效地多线程或多进程处理大型 itertools.combinations?

matlab - 如何生成数组中两个元素的所有排列?