16.某物品柜有5層,每層有10個格子,每個格子只能放一個物品。第1層格子編號依次為1到10,第2層格子編號依次為11到20,依此類推。有9組物品(組號1~9),每組有2到8個物品,物品總數(shù)不超過50個。將9組物品按組號由小到大依次放入柜中,放置方式有兩種:
(1)整體放置。按格子編號由小到大的次序查找第一個可放置該組全部物品的空區(qū)域(空區(qū)域是指從某個空格子開始的同層連續(xù)的所有空格子),若找到,則在該空區(qū)域居中、連續(xù)放置該組全部物品,如圖a所示。
(2)零散放置。若所有空區(qū)域格子數(shù)都小于該組物品數(shù),則將該組每個物品依次放置在當前編號最小的空格子中,如圖b所示。
編寫VB程序,模擬物品放置。運行程序,在列表框List1中顯示每組物品的組號和數(shù)量,單擊“放置”按鈕Command1,在列表框List2中顯示每組物品放置結果。程序運行界面如圖c所示。
(1)若第1、第2組的物品數(shù)分別為6和2,則放置第2組物品的格子編號依次為
。
(2)實現(xiàn)上述功能的VB程序如下,請在橫線處填入合適的代碼。
Constm=50’m表示物品柜的格子數(shù)
Constw=10’w表示物品柜每層的格子數(shù)
Constn=9’n表示物品的組數(shù)
’f(i)存儲第i個格子開始的同層連續(xù)的所有空格子數(shù)。f(i)為0表示第i個格子不是空格子
Dimf(m)AsInteger
Dima(n)AsInteger
PrivateSubForm_Load
’讀取各組物品的個數(shù)依次存入數(shù)組a,并在List1中顯示
’代碼略
EndSub
Functiongetpos(rAsIntegerAsInteger
’按格子編號從小到大的次序,查找空格子數(shù)≥r的第一個空區(qū)域
’若找到,返回該空區(qū)域的起始編號,否則返回-1
’代碼略
EndFunction
PrivateSubCommand1_Click ( )
DimiAsInteger,jAsInteger,kAsInteger,pAsInteger,vAsInteger
DimsAsString
Fori=1Tom
f(i)=w-(i-1)Modw’w為10,表示每層的格子數(shù)
Nexti
v=1
Fori=1Ton
s=““
p=
①Ifp=-1Then
j=1
DoWhilej<=a(i)
Iff(v)<>0Then
s=s+Str(v)
f(v)=
j=j+1
EndIf
②Loop
Else
k=(f(p)-a(i))\2
Forj=kTo1Step-1
f(p)=j
p=p+1
Nextj
Forj=
③f(j)=0
s=s+Str(j)
Nextj
EndIf
List2.AddItem“第“+Str(i)+“組:“+s
Nexti
EndSub