某手机APP为电影观众选座提供了程序推荐和自主选位功能。当观众购票选择程序推荐时,程序根据电影放映厅内每个座位的优先等级(用一个正整数表示其等级值,如图a所示),自第1排1号座开始,按自左向右逐排的顺序查找满足本次购票人数r的最优空位区(最优空位区是指从某个座位开始的同排连续的r个空位,且其等级值之和最高,若有多个最优空位区,则推荐最先找到的)。若找到,则显示出推荐的座位编号;若找不到,则提示自主选位。
例如:图a中放映厅内座位有9排10列,第5排10个座位的等级值依次为:1,2,3,4,5,5,4,3,2,1。全部座位为空时,当前购票人数为5,推荐座位编号为5排3-7号;如图b所示已经部分选座状态下,当前购票人数为2,推荐座位编号为6排3-4号。
编写VB程序,模拟上述功能。运行程序,在列表List1中显示目前选座状态,黑点表示已选座,白点表示空位,在文本框Text1中输入购票人数后,单击“推荐”按钮Command1,在标签Label3显示当前购票人座位的推荐结果。程序运行界面如图c所示。
(1)
如图a所示,全部座位为空时,第1次购票人数为4人,按程序推荐座位选座,座位等级值之和为 。
(2)
实现上述功能的VB程序如下,请在划线处填入合适的代码。
Const m = 9 'm 表示座位有9排
Const n = 10 'n 表示每排的座位数为10
Dim r As Integer 'r 表示当次输入的购票人数
Dim a(1 to m * n) As Integer 'a 数组存放每个座位的等级值
Dim b(1 to m * n + 1) As Integer 'b 数组保存当前各座位选座情况,选中为1,未选为 0
Private Sub Form_Load()
'从第1排开始,按座位编号从小到大顺序逐排读取座位等级值并依次存入数组a
'同上述顺序,读取选座状态存入数组元素b(1)至b(m*n)中,输出当前选座状态。代码略
End Sub
Function getsum(i As Integer, j As Integer) As Integer
'从第i排第j列开始,计算第i排中满足r个观众就座的连续空位等级值之和。
'若无法找到足够的连续空位时,则返回-1
Dim p As Integer, sum As
Integer, k As Integer
sum = 0
p = j: k = (i - 1) * n + p
Do While p <= j + r - 1 And
b(k) = 0
sum =
p = p + 1: k = k + 1
Loop
If p = j + r Then getsum = sum
Else getsum = -1
End Function
Private Sub Command1_Click()
Dim i As Integer, j As Integer,
s As String, max As Integer
Dim t As Integer, newi As
Integer, newj As Integer, pos As Integer
r = Val(Text1.Text)
max = 0
For i = 1 To m
For j = 1 To n - r + 1
If
max < t Then max = t: newi = i: newj = j
Next j
Next i
If max = 0 Then
Label3.Caption = "请自主选位" Else
pos = (newi - 1) * n + newj
For i =
b(i)
= 1
Next i
Label3.Caption
= "推荐座位编号:" & newi &
"排" & newj & "-" & newj
+ r - 1 & "座"
End If
End Sub
答案: 【1】18
【1】sum + a(k) 或 sum + a((i - 1) * n + p)【2】t = getsum(i, j)【3】pos To pos + r - 1 或 pos + r - 1 To pos Step -1