掷骰子组合问题

掷N个骰子,最小值是Nx1,最大值是NxSides,组合数是Sides^N次方.

通过观察下面简单的2个骰子的情形,可以看出这是个典形的递归。

 

IndexDice1Dice2Sum
1112
2123
3134
4145
5156
6167
7213
8224
9235
10246
11257
12268
13314
14325
15336
16347
17358
18369
19415
20426
21437
22448
23459
244610

 具体代码如下,可以分为从前往后处理,和分后往前处理两种情况

'Public Parameter
Public Out(), mOut, nOut     '输出数组
Public Nums%, Sides%         '骰子数,点数
Public Org()                 '多维数组
Public arr                   '临时变量

Sub Roll_Dice_2()
Dim i&, j&
Nums = 5             '骰子数量
Sides = 7            '骰子点数
ReDim Org(1 To Nums)
ReDim Out(1 To Sides ^ Nums, 1 To Nums)    '输出数组
ReDim arr(1 To Nums)          '临时数组
ReDim brr(1 To Sides)         '序列数组
For j = 1 To Sides
    brr(j) = j            '点数
Next j
For i = 1 To Nums
    Org(i) = brr     '将一维数组并入,产生多维数组
Next i
Dice_Combine_Recursion_Back 1, 1, Sides             '从后往前循环
Dice_Combine_Recursion_Front Nums, 1, Sides              '从前往后循环
Sheets("NxSides").Cells(2, 11).Resize(UBound(Out), UBound(Out, 2)) = Out
End Sub

'从后往前循环
'm表示骰子数
'k表示点数
Sub Dice_Combine_Recursion_Back(m, n, k)
Dim i, j                      '变量
For i = n To k               '循环点数
    arr(m) = Org(m)(i)       '数据写入
    If m < Nums Then
        Dice_Combine_Recursion_Back m + 1, n, k
    Else
        Arr_In_Out arr       '输出结果
    End If
Next i
End Sub

'从前往后循环
'm表示骰子数
'k表示点数
Sub Dice_Combine_Recursion_Front(m, n, k)
Dim i, j                     '变量
For i = n To k               '循环点数
    arr(m) = Org(m)(i)       '数据写入
    If m > 1 Then
        Dice_Combine_Recursion_Front m - 1, n, k
    Else
        Arr_In_Out arr       '输出结果
    End If
Next i
End Sub


'临时数组写入输出数组
Sub Arr_In_Out(arr)
nOut = nOut + 1
For mOut = 1 To UBound(arr)
    Out(nOut, mOut) = arr(mOut)
Next
End Sub

下图是用递归计算的5个骰子,7个点面的分布情况。

202151_mJqu_2718942.png

具体文件可以从网盘下载

http://pan.baidu.com/s/1c10zH9u

 

转载于:https://my.oschina.net/tedzheng/blog/1549404

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值