如图a中,5张骨牌的差值为:|(3+3-4-4)+(6+3-2-5)+(2+3-4-5)+(1+5-3-3)+(1+1-1-1)|=4。
每张骨牌都可以顺时针旋转90度,效果如图b所示。现在最多可以选择其中一张骨牌进行旋转,使得旋转后的骨牌差值变小。求一种旋转方案,并输出骨牌差值的最小值。
图a
图b |
编写VB程序,实现上述功能。运行程序,在文本框Text1中依次输入5张骨牌上的数字,单击“计算”按钮Command1,在文本框Text2、Text3、Text4中输出结果。程序运行界面如图b所示。
Dim a(1 To 20) As Integer ‘依次存储5张骨牌上的数字
Dim d(1 To 5) As Integer ‘依次存储5张骨牌,上下两行的差值
Const n = 5
Private Sub Form_Load()
'从文本框Text1读取5张骨牌上的数字,依次存入数组a
'a(1)~a(4)依次存储第一张骨牌从左到右从上到下四个数字
'a(5)到a(20)依次类推
'代码略
End Sub
Private Sub Command1_Click()
Dim i As Integer, up As Integer, down As Integer, t As Integer, k As Integer
Dim id As Integer, times As Integer, x As Integer, ans As Integer
For i = 1 To n
up = a(4 * i - 3) + a(4 * i - 2)
down = a(4 * i - 1) + a(4 * i)
d(i) = up - down
t = t + d(i)
Next i
id = 0 : times = 0
ans =
If ans <> 0 Then
k = 1
Do While k <= n
For x = 1 To 3
temp =
If temp < ans Then
ans = temp
id = k
End If
If temp = 0 Then Exit Do
Next x
k = k + 1
Loop
End If
Text2.Text = CStr(id)
Text3.Text = CStr(times)
Text4.Text = CStr(ans)
End Sub
Function turn(ByVal k As Integer, ByVal x As Integer) As Integer
‘求将第k张骨牌,顺时针旋转x次后,上下两行的差值,代码略
End Function