复杂的排列没有重复

时间:2012-01-15 17:57:43

标签: c# permutation combinations

我正在尝试为名为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个用户指定的技能...

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

1 个答案:

答案 0 :(得分:1)

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

2)避免花费太多时间/记忆/递归:我会根据唯一的技能对5 * 60项进行排序。然后我会通过寻找超过10的组合来创建组合,从高级技能开始,并在达到10时停止,或者在不到达时停止。
构建所有组合的功能如下所示:  1:如果我们有总项目技能&gt; 10:所有与其他项目的组合都可以。停。  2:如果当前的项目技能是计数&lt; 10在阵列中搜索下一个最大项目的未穿戴的​​部分 如果在数组中我们达到0或者我们达到一个值,使得(当前计数+值*剩下的片段类型数量)<10然后停止时间:-)
否则添加其技能数量,记下所使用的盔甲类型,然后为所有可能匹配的项目调用你的函数。

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

要存储组合,您可能需要添加“任何事情”案例,以避免存储/计算太多组合。 (例如:如果你有Carmak的Magical Hat,你有+100的编码,你可以穿任何你想要的方式,虫子会染!:-))