深耕专业教研,探索前沿技术
信息技术来源:2026年3月杭州二中高三开学适应性考试

第 15 题

答案与解析

第(1)小题

参考答案

36

按从1开始的行列编号,第五行的◆位于第2列。将它改为□后,第1~9行、第2~5列全部为空白,形成高9、宽4的矩形,面积为9×4=36。下表中▧表示这个矩形内的空白格,◆仍表示障碍。

行\列 1 2 3 4 5 6 7 8 9 10
1 □ ▧ ▧ ▧ ▧ □ □ □ □ ◆
2 □ ▧ ▧ ▧ ▧ □ □ □ □ □
3 □ ▧ ▧ ▧ ▧ □ □ □ □ □
4 ◆ ▧ ▧ ▧ ▧ ◆ □ □ □ □
5 □ ▧ ▧ ▧ ▧ □ □ □ □ □
6 □ ▧ ▧ ▧ ▧ □ □ □ ◆ □
7 □ ▧ ▧ ▧ ▧ □ □ ◆ □ □
8 □ ▧ ▧ ▧ ▧ □ □ □ □ □
9 □ ▧ ▧ ▧ ▧ □ □ □ □ □
10 □ □ ◆ □ □ □ □ □ □ □

还需排除更大的矩形,而不能只找到一个可行矩形就结束:

矩形高度 宽度限制及依据 面积上限
1~3 整张网格只有10列 30
4~5 任意连续4行必经过第4行或第7行;这两行的最长连续空白分别为4格、7格,因此宽不超过7 35
6~9 若经过第4行,宽不超过4;若不经过第4行,只能取第5~10行,其第7行第8列、第10行第3列的障碍使共同连续空白宽度不超过4 36
10 跨越全部行时,只有第4~5列构成最长的连续全空白列段,宽为2 20

各类高度的面积都不超过36,前面给出的矩形恰好达到36。第5~9行、第1~7列也能得到面积35的矩形,但它不是最大值。

第(2)小题

参考答案

break

程序分析

max_area = 0
for y in range(10):
    for x in range(10):
        if grid[y][x] == 0:
            ③

以下按原卷的语句位置和缩进分析:加框语句位于内层循环的else分支,主程序的面积比较位于if grid[y][x] == 0内部。

主程序按行、列枚举网格位置,grid[y][x]表示第y行第x列的元素,只有空白格才进入空③。结合函数注释,这里需要求以当前格子为左上角的最大空白矩形面积。

def search_max_rect(grid, start_x, start_y):
    max_area = 0; rows = 10; cols = 10
    if grid[start_y][start_x] == 1:
        return 0
    max_width = cols - start_x
    for y in range(start_y, rows):
        ...
    return max_area

start_x、start_y分别表示左上角的列下标和行下标。起点为障碍时直接返回0;否则以cols-start_x作为宽度的初始上限,再让底边行下标y逐行增大。

for y in range(start_y, rows):
    if ①:
        break
    current_width = 0
    for x in range(start_x, cols):
        if grid[y][x] == 0:
            current_width += 1
        else:
            current_width -= 1

每轮向下增加一行,空①决定是否终止扩展。横向扫描从start_x开始,遇到0使current_width增加1;原else分支遇到1只减1,之后仍会继续扫描右侧格子。

②
height = y - start_y + 1
area = max_width * height
if area > max_area:
    max_area = area

从start_y到y共有y-start_y+1行。area用max_width乘以这一高度,因此max_width需要满足所有已覆盖行的宽度限制。每次面积更大时更新max_area,逐行考察后返回固定左上角所能取得的最大面积。

填空分析

else分支中的current_width -= 1

空白矩形的一行必须连续,遇到第一个1时就应结束横向扫描,故将加框语句改为break。

例如从[0,0,1,0,0]的首格开始,连续空白宽度为2,原写法却得到3。break保留已经累计的2,并退出最内层for x循环;外层仍可继续向下考察。

第(3)小题

参考答案
  1. grid[y][start_x] == 1

  2. max_width = min(max_width,current_width)

  3. area = search_max_rect(grid, x, y)

共用程序分析见第(2)小题。

填空分析

①

左边界固定在start_x。若新加入的第y行在这一列为1,矩形已包含障碍,再向下扩展也无法避开它。因此填grid[y][start_x] == 1,由随后的break结束向下扩展。

②

第(2)问改正后,current_width是当前行的连续空白宽度。要同时满足此前各行与当前行的限制,应取原max_width和current_width中的较小值,填max_width = min(max_width,current_width)。

③

以当前空白格为左上角调用函数,并将返回面积交给后续比较。参数依次为网格、起始列、起始行,填area = search_max_rect(grid, x, y)。主程序枚举全部空白起点,函数考察各个可行底边,从而得到全图最大值。