能摆下一排物品,不代表能摆下同面积的完整矩形。查找最大空矩形时,需要让连续多行的同一段列都没有障碍。
地图为六行七列,空格记一,障碍记零。逐行把每列连续向上的空格数量累加成高度;在当前行的高度图中找出高度乘连续宽度最大的矩形,最后比较所有底边所在行。
输入与计算记录
六行七列原地图如下,一为空格,零为障碍;行列编号都从零开始。
地图: [1, 1, 1, 0, 1, 1, 1] [0, 1, 1, 1, 1, 1, 1] [0, 1, 1, 1, 1, 1, 1] [1, 1, 1, 1, 1, 1, 1] [1, 1, 1, 0, 1, 1, 1] [1, 1, 1, 0, 1, 1, 1] 每一行作为底边时的连续高度: [1, 1, 1, 0, 1, 1, 1] [0, 2, 2, 1, 2, 2, 2] [0, 3, 3, 2, 3, 3, 3] [1, 4, 4, 3, 4, 4, 4] [2, 5, 5, 0, 5, 5, 5] [3, 6, 6, 0, 6, 6, 6] 最大面积18,矩形范围(上、左、下端、右端)为[0, 4, 6, 7]。
阅读记录时先确认编号代表的是格子、对象、时间还是数组位置,再逐项对应输入与输出。中间状态提供了定位差异的依据,最后的一个合计数字不能替代全部步骤;没有对象的集合与数值零也应区别看待。
怎样检查这个结果
候选矩形必须逐格为空,不能只检查四角。面积相同时,本例按顶部行、左侧列、底部结束行、右侧结束列的字典顺序选择;底部和右侧坐标不包含在范围中。
这只寻找轴对齐且不旋转的完整空矩形,未保留物体边距,也不处理不规则占格。最大的面积未必适合某个固定宽高的道具,因此真正摆放时还要检查它的尺寸要求。
可以遮住结果表先按规则复算第一步,再选择一个边界输入重复操作。若更换规则中的任一前提,应重新推导结果,不要只调整最后答案。这样既能理解本例为何成立,也能看清它在哪些情况下不再适用。
