【问题标题】:Complex permutations without repetition无重复的复杂排列
【发布时间】:2012-01-15 17:57:42
【问题描述】:

我正在尝试为名为 Monster Hunter 的游戏创建一个工具(供个人使用)。我以前使用过排列,但没有这么复杂的东西,所以我完全被卡住了。

在游戏中你穿戴 5 件盔甲。每件作品都有许多不同技能之一的技能点。如果在计算整套技能后,您在某项技能上的技能点数达到 10+,您就可以获得该技能。

例子:

Foo Head: Attack +2, Guard + 2
Foo Chest: Defense + 5    
Foo Body: Guard + 2, Attack + 5, Defense +2
Foo Arm: Attack + 3, Speed + 4
Foo Legs: Attack + 5, Guard + 6, Defense + 3

The above set would result in 10+ in Attack, Defense, and Guard (not speed).

我想知道如何找到给定 2-3 个用户指定技能的所有盔甲组合。因此,如果您选择“攻击”和“速度”,它将为您提供 5 件盔甲的所有可能组合,这将导致“攻击”和“速度”都 +10。 5 个类别中的每个类别大约有 60 种不同的项目。

我知道我可以使用 LINQ 过滤 5 类盔甲部件中的每一种,这样我只能返回包含 2 种指定技能之一的所有物品的列表,但我不知道如何进行排列因为我要兼顾 2-3 种用户指定的技能......

我希望我有可以显示的工作代码,但我现在迷失了方向,不知道从哪里开始。我不是在寻找答案本身,而是关于如何到达那里的建议。谢谢。

【问题讨论】:

    标签: c# permutation combinations


    【解决方案1】:

    1) 我会尝试只找到 1 个技能,然后为第二个/第三个过滤该项目集

    2) 避免花费太多时间/内存/递归:我会根据唯一的技能对 5 * 60 个项目进行排序。然后我会通过寻找加起来超过 10 的组合来创建组合,从高级技能开始,当达到 10 或无法达到时停止。
    构建所有组合的函数如下所示: 1:如果我们的物品总技能>10:与其他物品的所有组合都可以。停止。 2:如果当前物品技能计数 如果在数组中我们达到了 0 或者我们达到了一个值,使得(当前计数 + 值 * 剩余块类型的数量) 否则添加它的技能计数,记下使用的盔甲类型,然后为所有可能匹配的物品调用你的函数。

    好吧,我可能不够精确,但您看到了这个想法:使用条件进行调用以避免递归性爆炸。因为 60*60*60*60*60 很多。和(快速)排序 5*60=300 个项目没什么。

    要存储您的组合,您可能需要添加“随便什么”案例,以避免存储/计算太多组合而无用。 (例如:如果你有卡马克的魔法帽,你的编码有 +100,你可以随心所欲地穿衣服,虫子会染色!:-))

    【讨论】:

      猜你喜欢
      • 2013-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-27
      • 1970-01-01
      • 2021-01-02
      • 2018-10-16
      • 1970-01-01
      相关资源
      最近更新 更多