|
1
5
这是GD047和Marek提供的代码。
注意:这是最理想的,因为它不会尝试生成全部,然后丢弃重复对象。
解释其工作原理: 骰子上可能的数字是1到N。 假设您得到了骰子数字的可能组合:x 一 ,X 二 ,…,X S 其中s是骰子的数目。 既然订单无关紧要,我们可以假设 X 一 小于x 二 小于,…x S . 现在考虑序列x 一 ,X 二 + 1,X 三 + 2,…,X S +S-1。 (例如:1,1,1变为1,1+1,1+2=1,2,3)。 这个新序列有从1到n+s-1的数字,所有的数字都是不同的。 从你的骰子序列到我们创建的新的骰子序列的映射是1-1,并且很容易可逆。 因此,要生成S骰子与数字1到N的可能组合,您需要做的就是生成所有N+S-1,从1,2,…,N+S-1中选择S数字的组合。给定这样一个组合,你将它排序,从最小的减去0,从第二个最小的减去1,依此类推,得到你的骰子编号组合,用于编号为1到n的S骰子。 例如,假设n=6,s=3。 您将生成一个由3个数字组成的组合,从1到6+3-1=8,即从1、2、…、8生成3个数字。 假设你得到3,6,7。这意味着3,6-1,7-2=3,5,5。 如果你得到1,2,8。这将转化为1,1,6。 顺便说一下,这个映射也证明了你的公式。 |
|
|
2
1
一般来说,你需要从原始数据中对每个结果进行排序。
但是,您可能会很棘手,并选择所有排序结果的子集:
第二个版本更快。 |
|
|
feasega · 聚合物模拟-2个节点之间的最短路线,适用于所有节点 1 年前 |
|
|
Alisa Petrova · 在有向图中更改一对顶点以创建循环 1 年前 |
|
|
b39b332d · 使用C++标准库实现高效间隔存储 1 年前 |
|
ABGR · 二叉树的直径——当最长路径不通过根时的失败案例 1 年前 |
|
|
EpicAshman · 数独棋盘程序中同一列和同一行出现两次的数字 1 年前 |