第 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_areastart_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)小题
grid[y][start_x] == 1
max_width = min(max_width,current_width)
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)。主程序枚举全部空白起点,函数考察各个可行底边,从而得到全图最大值。
问题反馈
解析有疑问或显示异常?请先复制题目信息,再打开反馈表单填写。
题目编号:2026_03_G3_hangerkaixue_q015
