物品装柜

提交数: 475, 通过率: 45.26%, 平均分: 49.35

题目描述:

某物品柜有5层,每层有10个格子,每个格子只能放一个物品。第1层格子号依次为1到10,第2层格子编号依次为11-20。依此类推。有9组物品(组号1~9),每组有2到8个物品,物品总数不超过50个:将9组物品按组号由小到大依次放入柜中,放置方式有两种:

1)整体放置。按格子编号由小到大的次序查找第一个可放置该组全部物品的空区域(空区域是指从某个空格子开始的同层连续的所有空格子),若找到,则在该空区域居中、连续放置该组全部物品,如图a所示。

2)零散放置。若所有空区域格子数都小于该组物品数,则将该组每个物品依次放置在当前编号最小的空格子中,如图b所示。

1648632603159039470.png

输入格式:

一行有9个整数,整数之前用一个空格分隔,分别表示1-9组物品每组的个数。

输出格式:

输出共9行,表示每组物品在柜子中所放置的格子编号。

样例输入:

8 4 6 8 3 6 4 5 3

样例输出:

2 3 4 5 6 7 8 9
14 15 16 17
23 24 25 26 27 28
32 33 34 35 36 37 38 39
11 12 13
43 44 45 46 47 48
1 10 18 19
20 21 22 29 30
31 40 41

提示:

请完善程序:

def init():
    for i in range( n ):
        for j in range( m ):
            if q[i][j] == 0:
                k = j + 1
                while k < m and q[i][k] != 1:
                    k += 1
                _______(1)_______
            else:
                v[i][j] = 0
def getpos( L ):
    ret = -1
    for i in range( n ):
        for j in range( m ):
            if _______(2)________:
                ret = [ i, j ]
                return ret
    return ret

n = 5     #层数
m = 10    #列数
T = 9     #组数
q = [ [0 for i in range(m)] for j in range(n) ]       #保存物品放的情况
v = [ [0 for i in range(m)] for j in range(n) ]
init()       #预处理
# print(v)
a = list( map( int, input().split() ) )     #输入每组物品数量
start = 0
for i in range( T ):   #枚举每一组的物品
    p = getpos( a[i] )  #a[i]为该组物品的数量,即需要占用的格子数量
    if p != -1:
        row = p[0]
        col = p[1]
        k = ______(3)_______
        k = k // 2
        t = col
        for j in range( k, 0, -1 ):
            v[row][t] = j           #更新v数组
            t += 1
        for j in range( t, t + a[i] ):
            q[row][j] = i + 1
            v[row][j] = 0
    else:
        cnt = 0
        while cnt < a[i]:
            row = start // m
            col= start % m
            if q[row][col] == 0:
                q[row][col] = i + 1
                v[row][col] = 0
                cnt += 1
            start += 1

#输出放置情况
# for i in q:
#     print( i )
for k in range( T ):
    for i in range( n ):
        for j in range( m ):
            if q[i][j] == k+1:
                print( ______(4)_______, end = " ")
    print()
时间限制: 1000ms
空间限制: 256MB

来源: 2021.01选考题