Algorithm 组合谜题
我想知道解决以下问题的最佳方法是什么: 我现在有一张Algorithm 组合谜题,algorithm,combinations,Algorithm,Combinations,我想知道解决以下问题的最佳方法是什么: 我现在有一张地图。比如说,这是一张用餐地图,上面有你在用餐时可以提供的饮料。例如 早餐-橙汁 早餐-咖啡 午餐-橙汁 午餐-苏打水 午餐啤酒 晚餐-苏打水 晚餐-啤酒 晚餐-葡萄酒 所以我的收藏真的是Map 我需要做的是创建一个列表,列出用餐期间的各种饮料组合。在这种情况下,我将有18个组合。例如 [ [ 早餐->橙汁, 午餐->橙汁, 晚餐->苏打水 ] [ 早餐->橙汁, 午餐->橙汁, 晚餐->啤酒 ] [ 早餐->橙汁, 午餐->橙汁, 晚餐->葡
地图
。比如说,这是一张用餐地图,上面有你在用餐时可以提供的饮料。例如
早餐-橙汁
早餐-咖啡
午餐-橙汁
午餐-苏打水
午餐啤酒
晚餐-苏打水
晚餐-啤酒
晚餐-葡萄酒
所以我的收藏真的是Map
我需要做的是创建一个列表
,列出用餐期间的各种饮料组合。在这种情况下,我将有18个组合。例如
[
[
早餐->橙汁,
午餐->橙汁,
晚餐->苏打水
]
[
早餐->橙汁,
午餐->橙汁,
晚餐->啤酒
]
[
早餐->橙汁,
午餐->橙汁,
晚餐->葡萄酒
]
[
早餐->橙汁,
午餐->苏打水,
晚餐->苏打水,
]
等等。。。
]
我感兴趣的是看看其他人将如何着手创建最终的收藏
另外,我正在使用java,所以漂亮的功能性东西是不允许的
谢谢
编辑
膳食类型是动态的。也就是说,晚餐可以从列表中删除,也可以添加早午餐。如果我做对了,这里没有什么神奇之处,只需在嵌套循环中迭代3个集合即可
for (String breakfastBev : breakfast) {
for (String lunchBev : lunch) {
for (String dinnerBev : dinner) {
System.out.println(breakfastBev + ", " + lunchBev + ", " + dinnerBev);
}
}
}
我相信现在您可以了解如何使用地图和输出列表:-)
编辑:对于更改的需求,一种方法是递归:
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);
}
}
main(){
列表输出=新的ArrayList();
recordBeverages(新的HashMap(),BeveragesbyFine,输出);
}
作废记录饮料(访问地图、用餐地图、列表输出){
if(fines.isEmpty()){
输出。添加(已访问);
}
String mealType=fines.keySet().iterator().next();
Map remainingfends=新HashMap(已访问);
remainingfines.keySet().remove(mealType);
用于(饮料bev:膳食。获取(mealType)){
Map newVisited=新HashMap(已访问);
newvisted.put(mealType,bev);
记录饮料(新到访、剩余膳食、产量);
}
}
没有经过测试,但你明白了。使用一组计数器,计数器的数量与用餐的数量相同。在一个循环中,增加第一个,直到它到达第一顿饭的最后一个饮料,然后增加下一个(滴流)。当最后一顿饭的最后一杯饮料到达时,你就完成了
我将把代码留给您。啊,我应该补充一点,我不知道有多少种膳食类型。例如,可以增加早午餐。尽管如此,我认为你可能是对的,因为我考虑过了。这就是我如何实现它的,所以我很高兴能确信这是一种可以接受的方式。谢谢