|
本帖最后由 天山草 于 2016-10-22 22:31 编辑
以下是 VB 程序,未必好,只不过运行还正确而已。
'有四种颜色的珠子足够多,穿成六个一串的环形手串。有几种方法?
'编程思路:由 1,2,3,4 构成的六位数有多少个?最小的数是 111111,最大的是444444。共有 4^6 = 4096个数字。
'例如,中间的某个数例如是 124313,此为正序串,逆序是313421。
'正序手串是 1 2 逆序手串是 3 1 也就是 313421
' 3 4 1 3
' 1 3 2 4
'与正序相同的串有 243131,431312,313124,131243,312431。
'与逆序相同的串有 134213,342131,421313,213134,131342。
'那么如何只保留124313 而淘汰掉其余 11 个重复的手串呢?具体方法见程序注释——
'运行结果:共有 430 种穿法。
' 以下是正式程序——
Private Sub form_Click()
Dim a$(4096), b$(4096)
k = 0
mi = "111110"
For i = 1 To 4096 '从 111111 按四进制逐次加 1,加 4096 次,最后得到 444444 为止。
mi = mi + 1
If Mid(mi, 6, 1) = 5 Then Mid(mi, 6, 1) = 1: Mid(mi, 5, 1) = Mid(mi, 5, 1) + 1
If Mid(mi, 5, 1) = 5 Then Mid(mi, 5, 1) = 1: Mid(mi, 4, 1) = Mid(mi, 4, 1) + 1
If Mid(mi, 4, 1) = 5 Then Mid(mi, 4, 1) = 1: Mid(mi, 3, 1) = Mid(mi, 3, 1) + 1
If Mid(mi, 3, 1) = 5 Then Mid(mi, 3, 1) = 1: Mid(mi, 2, 1) = Mid(mi, 2, 1) + 1
If Mid(mi, 2, 1) = 5 Then Mid(mi, 2, 1) = 1: Mid(mi, 1, 1) = Mid(mi, 1, 1) + 1
k = k + 1
a(k) = Trim(mi) '这 4096 个数字存放在 a 数组中,以字串方式存放。
b(k) = a(k) '此后 a 数组中的数字会变化,备份一个到 b 数组。
Next i
For k = 1 To 4096 '通过 a 与 b 的对照,将 a 中重复的数标记为 0
c1 = Mid(b(k), 1, 1): c2 = Mid(b(k), 2, 1): c3 = Mid(b(k), 3, 1): c4 = Mid(b(k), 4, 1): c5 = Mid(b(k), 5, 1): c6 = Mid(b(k), 6, 1)
c0 = c1 + c2 + c3 + c4 + c5 + c6 '正串
cc1 =c2 + c3 + c4 + c5 + c6 + c1: cc2 = c3 + c4 + c5 + c6 + c1 + c2: cc3 = c4 + c5 + c6 + c1 + c2 + c3:
cc4 = c5 + c6 + c1 + c2 + c3 + c4: cc5 = c6 + c1 + c2 + c3 + c4 + c5
d0 = c6 + c5 + c4 + c3 + c2 + c1 '逆串
dd1 = c5 + c4 + c3 + c2 + c1 + c6: dd2 = c4 + c3 + c2 + c1 + c6 + c5: dd3 = c3 + c2 + c1 + c6 + c5 + c4:
dd4 = c2 + c1 + c6 + c5 + c4 + c3: dd5 = c1 + c6 + c5 + c4 + c3 + c2
For j = k + 1 To 4096
If b(j) = cc1 Or b(j) = cc2 Or b(j) = cc3 Or b(j) = cc4 Or b(j) = cc5 Or b(j) = d0 Or b(j) = dd1 _
Or b(j) = dd2 Or b(j) = dd3 Or b(j) = dd4 Or b(j) = dd5 Then a(j) = 0
Next j
Next k
n = 0
For k = 1 To 4096 '把 a 中重复的数筛选掉
If a(k) = 0 Then GoTo 20
n = n + 1
Print n; "---"; a(k)
20: Next k
End Sub |
|