|
|

楼主 |
发表于 2017-5-21 21:58
|
显示全部楼层
用 VB 写的程序如下:
Private Sub form_Click()
Open "金字塔方案有多少种.txt" For Output As #1
Dim x(8) As String
x(1) = 11111111: x(2) = 1111111: x(3) = 111111: x(4) = 11111: x(5) = 1111: x(6) = 111: x(7) = 11: x(8) = 1
m = 8 '八位数
n = 0
For i = x(1) To x(1) + 10 ^ 10 '实际上达不到这么多循环。
x(1) = x(1) + 1 '从最小的数字开始依次加 1,把不符合要求的去掉,符合要求者写入文件。
For j = m To 2 Step -1 '将字符串变换成“二进制”串(由1,2 组成,不是由 0,1 组成)
If Mid(x(1), j, 1) = 3 Then
Mid(x(1), j, 1) = 1 '本位变为 2
Mid(x(1), j - 1, 1) = 1 + Mid(x(1), j - 1, 1) '高位加上进位 1
End If
Next j
If Mid(x(1), 1, 1) = 3 Then GoTo 999 '控制结束的语句,最高位变成 3,则结束运行。
'以下筛选出符合要求的字串:
a1 = 0 '底层的蓝球数目
For j = 1 To 8 '
If Mid(x(1), j, 1) = 1 Then a1 = a1 + 1
Next j
If a1 <> 4 Then GoTo 222 '底层的蓝球数目不等于 4 则跳过不用。
For jj = 1 To 7
For j = 1 To 8 - jj '第二层至第八层的排法
If Mid(x(jj), j, 1) <> Mid(x(jj), j + 1, 1) Then Mid(x(jj + 1), j, 1) = 1
If Mid(x(jj), j, 1) = Mid(x(jj), j + 1, 1) Then Mid(x(jj + 1), j, 1) = 2
Next j
Next jj
aa = 0 '以下统计所有层的蓝球数目
For jj = 1 To 8
For j = 1 To 9 - jj '统计第一层至第八层中所有蓝球的数目
If Mid(x(jj), j, 1) = 1 Then aa = aa + 1
Next j
Next jj
If aa <> 21 Then GoTo 222 '各层的蓝球数目之和不等于 21 则跳过不用。
n = n + 1
Print n; "=>"; Trim(x(1))
Print #1, n; "=>"; Trim(x(1))
222: Next i
999: Print " n ="; n
Print #1, " n ="; n
If n = 0 Then Print "无解!"
Close
End Sub |
|