我正在开发一个棋盘游戏的概率分析程序。作为算法的一部分,我需要计算一个数字的分区的可能排列(加上一些填充),以便所有分区组件不能占据任何位置,该位置低于排列的总长度(以数字为单位)减去该组件的值。
(然而,将被分割的数字永远不可能高于8,排列的长度永远不可能超过7。)
例如,假设我的分区为4,"211",并且我想在填充为2时找到排列,即长度为5:
0 1 2 3 4 (array indexes)
5 4 3 2 1 (maximum value of partition component that can be allocated to each index)
2 1 1 _ _ (the partition plus 2 empty indexes)
这表示为一个类似于so{2,1,1,0,0}的数组
当2在0索引(4!/2!2!)中时,有6个排列,2可以占用4个索引(2不能放在最后一个索引中),因此在这种情况下总共有24个排列(1可以占用任何索引)。
输入"21100"的输出:
211002110210011201011120011
02110、02101、02011、12100、12010、12001
00211、10210、11200、10201、01210、01201
10021、01021、00121、11020、1012001120
请注意,这只是"21100"的所有排列的集合减去其中2在第4个索引中的排列。这是一个相对简单的案例。
该问题可以描述为组合n个不同的排列组,因为上述情况可以表示为x=1 n=4的排列和x=2 n=5的排列的组合,其中x是值计数,n是"空间"计数。
我的困难在于制定一种可以通过计算获得所有可能性的方法,任何建议都将不胜感激-请原谅我的问题中术语混乱。
*该算法回答了以下问题:
有一组n单位被攻击k次。每个攻击有p的失误机会和q(1-p)的伤害机会集合中的一个随机单元。第二次损坏的单元被摧毁并且从集合中移除。
发生的可能性有多大攻击后,x未受损单位、y受损单位和z被毁单位?
如果有人知道解决这个问题的更直接的方法,请告诉我。
我将使用该算法生成多集的所有排列,如问题的答案所示
如何生成多集的所有排列?
然后过滤以符合我的标准。