45°旋转矩形求和代码中range范围计算逻辑的技术咨询
旋转矩形求和循环范围的逻辑解释
先明确基础定义:
- 矩阵行索引为
i(取值0到rows-1),列索引为j(取值0到cols-1) - 我们要找的a×b旋转矩形,是由两条平行主对角线(左上→右下)和两条平行副对角线(右上→左下)围成的斜向区域,
w和h对应矩形两个维度的边界元素数(比如w是沿主对角线方向的边长,h是沿副对角线方向的边长)
第一个循环范围:range(w - 1, rows - h + 1)
这个循环遍历的是旋转矩形沿副对角线方向的下边界行索引i,逻辑如下:
- 下限
w-1:旋转矩形沿主对角线方向需要容纳w个元素。当i取w-1时,对应的最左列j刚好能取到0(此时i-j = w-1,是主对角线方向的一条边界);如果i小于w-1,计算出的左边界列索引会小于0,超出矩阵左边界,所以i不能比w-1小。 - 上限
rows - h + 1:因为range是左闭右开结构,实际i的最大取值是rows - h。旋转矩形沿副对角线方向需要容纳h个元素,从i向上(行索引减小)数h-1步刚好覆盖h行;如果i超过rows - h,向上延伸时会超出矩阵上边界(行索引小于0)。
第二个循环范围:range(0, cols - (h + w - 1) + 1)
这个循环遍历的是旋转矩形沿主对角线方向的左边界列索引j,逻辑如下:
- 旋转矩形在列方向的总跨度是
h + w -1:斜向矩形的横向覆盖宽度等于两个维度的元素数之和减1,可以理解为“斜着占的列数是两个边长叠加后减去重叠的1个顶点”。 - 上限
cols - (h + w -1) +1:同样因为range左闭右开,实际j的最大取值是cols - (h + w -1)。如果j超过这个值,向右延伸h + w -1列时会超出矩阵右边界(列索引大于cols-1)。 - 下限0:列索引不能小于矩阵左边界,所以从0开始。
示例验证
假设矩阵为10行×10列(rows=10,cols=10),要找3×2的旋转矩形(w=3,h=2):
- 第一个循环范围:
range(3-1, 10-2+1)→range(2,9),i可取2~8(包含),确保沿主对角线有3个元素、沿副对角线有2个元素不越界。 - 第二个循环范围:
range(0,10-(2+3-1)+1)→range(0,7),j可取0~6(包含),确保横向跨度4列不越界。
内容的提问来源于stack exchange,提问作者meallhour
相关产品推荐
相关产品推荐

