当前位置: 首页 > news >正文

【算法解析】n×m 网格中正方形与长方形数量的数学推导与高效计算(漫画解析)

【算法解析】n×m 网格中正方形与长方形数量的数学推导与高效计算

在算法竞赛和编程面试中,经常遇到一类经典问题:给定一个n × m n \times mn×m的方格棋盘,求其中包含多少个正方形、多少个长方形(不包含正方形)。本文将从原理出发,详细推导其数学公式,并提供两种实现方式的对比分析,最终给出最优解。

典型题目链接:P2241 统计方形(数据加强版)


一、问题理解

题目中的“n × m n \times mn×m方格”指的是由n nn行、m mm列单位小方格组成的矩形网格。我们需要统计:

  1. 所有可能的正方形区域(边长为 1, 2, …,min ⁡ ( n , m ) \min(n, m)min(n,m),且边与网格线对齐);
  2. 所有可能的长方形区域(不含正方形),即矩形中长 ≠ 宽的部分。

注意:这里的“矩形”包括正方形,而“长方形”在本题语境下特指“非正方形的矩形”。


二、总矩形数的推导

任意一个矩形由其上下边界和左右边界唯一确定。在一个n × m n \times mn×m的网格中:

  • 水平方向有n + 1 n+1n+1条横线,从中任选 2 条作为上下边界,共有n ( n + 1 ) 2 \frac{n(n+1)}{2}2n(n+1)种选法;
  • 垂直方向有m + 1 m+1m+1条竖线,从中任选 2 条作为左右边界,共有m ( m + 1 ) 2 \frac{m(m+1)}{2}2m(m+1)种选法。

因此,所有矩形的总数为

T = n ( n + 1 ) 2 ⋅ m ( m + 1 ) 2 T = \frac{n(n+1)}{2} \cdot \frac{m(m+1)}{2}T=2n(n+1)2m(m+1)

该公式简洁且高效,是后续计算的基础。

漫画演示:


三、正方形数量的两种求法

方法一:枚举边长(循环法)

设正方形边长为k kk1 ≤ k ≤ min ⁡ ( n , m ) 1 \leq k \leq \min(n, m)1kmin(n,m)),则其左上角可在( n − k + 1 ) × ( m − k + 1 ) (n - k + 1) \times (m - k + 1)(nk+1)×(mk+1)个位置放置。因此,正方形总数为:

S = ∑ k = 1 min ⁡ ( n , m ) ( n − k + 1 ) ( m − k + 1 ) S = \sum_{k=1}^{\min(n,m)} (n - k + 1)(m - k + 1)S=k=1min(n,m)(nk+1)(mk+1)

该方法直观易懂,时间复杂度为O ( min ⁡ ( n , m ) ) O(\min(n, m))O(min(n,m))。对于n , m ≤ 5000 n, m \leq 5000n,m5000的数据范围,最多执行 5000 次循环,在实际运行中完全可接受。

方法二:闭式公式(数学优化)

通过代数变换,上述求和可转化为闭式表达。令a = min ⁡ ( n , m ) a = \min(n, m)a=min(n,m)b = max ⁡ ( n , m ) b = \max(n, m)b=max(n,m),则:

S = ∑ k = 1 a ( a − k + 1 ) ( b − k + 1 ) = ∑ x = 1 a x ( b − a + x ) S = \sum_{k=1}^{a} (a - k + 1)(b - k + 1) = \sum_{x=1}^{a} x(b - a + x)S=k=1a(ak+1)(bk+1)=x=1ax(ba+x)

d = b − a d = b - ad=ba,利用求和公式∑ x = a ( a + 1 ) 2 \sum x = \frac{a(a+1)}{2}x=2a(a+1)∑ x 2 = a ( a + 1 ) ( 2 a + 1 ) 6 \sum x^2 = \frac{a(a+1)(2a+1)}{6}x2=6a(a+1)(2a+1),可得:

S = d ⋅ a ( a + 1 ) 2 + a ( a + 1 ) ( 2 a + 1 ) 6 = a ( a + 1 ) ( 3 b − a + 1 ) 6 S = d \cdot \frac{a(a+1)}{2} + \frac{a(a+1)(2a+1)}{6} = \frac{a(a+1)(3b - a + 1)}{6}S=d2a(a+1)+6a(a+1)(2a+1)=6a(a+1)(3ba+1)

此即正方形数量的闭式公式,计算仅需常数时间。

验证示例

n = 2 , m = 3 n = 2, m = 3n=2,m=3为例:

  • a = 2 , b = 3 a = 2, b = 3a=2,b=3
  • S = 2 ⋅ 3 ⋅ ( 9 − 2 + 1 ) 6 = 6 ⋅ 8 6 = 8 S = \frac{2 \cdot 3 \cdot (9 - 2 + 1)}{6} = \frac{6 \cdot 8}{6} = 8S=623(92+1)=668=8

与手动枚举结果一致。

漫画演示:


四、长方形数量的计算

根据容斥原理:

长方形数量 = 总矩形数 − 正方形数量 = T − S \text{长方形数量} = \text{总矩形数} - \text{正方形数量} = T - S长方形数量=总矩形数正方形数量=TS

无需单独枚举非正方形矩形,避免了复杂的分类讨论。


五、代码实现对比

循环法(清晰直观)

longsquares=0;intmin=Math.min(n,m);for(intk=1;k<=min;k++){squares+=(long)(n-k+1)*(m-k+1);}

闭式法(高效优雅)

longa=Math.min(n,m);longb=Math.max(n,m);longsquares=a*(a+1)*(3*b-a+1)/6;

注意:所有变量必须使用long类型,防止中间结果溢出。当n = m = 5000 n = m = 5000n=m=5000时,最大中间值约为2.5 × 10 11 2.5 \times 10^{11}2.5×1011,远超int范围(约2 × 10 9 2 \times 10^92×109)。

漫画演示:


六、效率与适用性分析

维度循环法闭式法
时间复杂度O ( min ⁡ ( n , m ) ) O(\min(n, m))O(min(n,m))O ( 1 ) O(1)O(1)
实际运行时间微秒级(≤5000 次)纳秒级
代码长度稍长极简
可扩展性仅适用于较小规模适用于极大n , m n, mn,m(只要不超 long)
通用性仅适用于标准网格正方形计数同左

虽然在本题数据范围内两者性能差异在 OJ 上可能都显示为 0ms,但闭式法体现了“用数学优化算法”的核心思想,是更优的工程实践。


七、公式的适用边界

该闭式公式仅适用于以下条件同时满足的情形

  1. 网格完整无缺(无障碍物);
  2. 正方形边必须与网格线平行(不允许旋转);
  3. 统计所有尺寸的正方形总数。

若问题变体涉及障碍物、旋转正方形、仅统计特定边长、或三维扩展等,则需重新建模,不能直接套用此公式。

漫画演示:


八、总结

  • 总矩形数T = n ( n + 1 ) 2 ⋅ m ( m + 1 ) 2 \displaystyle T = \frac{n(n+1)}{2} \cdot \frac{m(m+1)}{2}T=2n(n+1)2m(m+1)
  • 正方形数S = a ( a + 1 ) ( 3 b − a + 1 ) 6 \displaystyle S = \frac{a(a+1)(3b - a + 1)}{6}S=6a(a+1)(3ba+1),其中a = min ⁡ ( n , m ) , b = max ⁡ ( n , m ) a = \min(n,m), b = \max(n,m)a=min(n,m),b=max(n,m)
  • 长方形数T − S T - STS

推荐在实际编程中优先采用闭式公式法,它不仅效率更高,而且代码简洁、逻辑严谨,是解决此类组合计数问题的最佳实践。

http://www.jsqmd.com/news/392560/

相关文章:

  • 长上下文“记忆“的舒适陷阱:为什么更多记忆不等于更可靠
  • 2026木薯淀粉市场推荐:实力公司助力选择,宠物饲料淀粉/小苏打/玉米淀粉/水产饲料粘合剂/型煤淀粉,淀粉公司口碑推荐榜 - 品牌推荐师
  • 2026涡轮增压器市场:潍柴P10H.5实力厂家如何抉择,工程机械增压器/康明斯增压器,涡轮增压器供应商推荐排行榜 - 品牌推荐师
  • 题解:洛谷 P1115 最大子段和
  • 2026年2月,可靠IL - 6试剂盒选择秘籍公开,鸡试剂盒/鱼试剂盒/试剂盒,IL-6试剂盒供应商怎么选择 - 品牌推荐师
  • 二阶单bit量化CIFB sigma-delta调制器:简单入门电路、Simulink模型、M...
  • 毕业季必收藏!这9款AI降AIGC率工具网站亲测好用
  • 数据可视化产品设计:让大数据说话的艺术与技巧
  • Steiner 系初探
  • BISHI59 阶乘末尾非零数字
  • 聚焦2026:国内棒料机打孔实地厂家综合实力排行,数控车床加工/深孔钻加工/冷镦非标件,棒料机打孔品牌找哪家 - 品牌推荐师
  • 题解:洛谷 P1638 逛画展
  • 0基础能不能转大模型?到底怎么转?大模型实战指南:小白程序员2026年转行AI必读(收藏版)
  • 探寻2026伺服油压机口碑佳企,解锁行业新趋势,粉末压机/伺服油压机/电子压床/伺服热压机,伺服油压机企业哪个好 - 品牌推荐师
  • 小白福利!收藏这份AI大模型自学路线,带你从入门到精通(附104G免费学习资源)
  • 传感器02-激光雷达(LiDAR):解密自动驾驶的“千里眼”——激光雷达(LiDAR)全方位深度解析
  • 传感器01-相机:
  • AI技术干货|大语言模型知识大全!从入门到精通,通俗易懂!|附391页PDF文件下载
  • 2026选圣女果选果机,这些制造商别错过!小蕃茄选果机/AI无损测糖选果机/智能水果分选机,选果机实力厂家排行榜 - 品牌推荐师
  • 2026多模态大语言模型技术发展报告|附74页PDF文件下载
  • day89(2.18)——leetcode面试经典150
  • 【Docker高级篇】Docker网络进阶:Host/None模式用法拆解,新手也能避开配置坑
  • 【Docker高级篇】容器日志只懂docker logs?Prometheus+Grafana+ELK集成实操,监控效率翻倍
  • 数据产品微服务架构:大数据系统的模块化设计
  • 水处理设备2.5D、2D器械插画设计
  • 大模型工程师?别被吓到!月薪翻倍攻略,小白也能收藏看懂!
  • python: Command Pattern
  • 人音教育网站及移动端界面设计(打造属于你的音乐学习圈)
  • 2026.2.18
  • Python Web 开发进阶实战:联邦学习优秀的平台 —— 在 Flask + Vue 中构建隐私保护的分布式 AI 训练平台