C++棋盘矩形个数计算:组合数学公式及代码实现
## 🧮 棋盘矩形个数计算 **核心思路**:在一个 N×M 的网格棋盘中,**任意一个矩形**可以由它的**两条水平边**和**两条垂直边**确定。 - 水平方向有 `N+1` 条线,从中任选 2 条作为矩形的上下边界 → 组合数 `C(N+1, 2)` - 垂直方向有 `M+1` 条线,从中任选 2 条作为矩形的左右边界 → 组合数 `C(M+1, 2)` - 总矩形数 = `C(N+1, 2) × C(M+1, 2)` = `N*(N+1)/2 * M*(M+1)/2` ### 📦 C++ 实现代码 ```cpp #include <iostream> using namespace std; int main() { long long N, M; // 使用 long long 防止溢出(N,M最大100时结果约为 2.5e7,但保险起见) cin >> N >> M; // 公式:N*(N+1)/2 * M*(M+1)/2 long long rectCount = (N * (N + 1) / 2) * (M * (M + 1) / 2); cout << rectCount << endl; return 0; } ``` ### 🔍 代码详解 - **`long long` 类型选择**:虽然 N,M ≤ 100 时结果最大约 `100*101/2 * 100*101/2 ≈ 25,502,500`,仍在 `int` 范围内(约 21 亿),但使用 `long long` 更安全,避免未来扩展或边界计算时的意外溢出。 - **公式推导**:`C(N+1, 2) = N*(N+1)/2`,同理垂直方向。两者相乘即为答案。 - **除法顺序**:先做乘法再除以2可能导致中间结果过大,因此**先除后乘**(`N*(N+1)/2` 保证整数除法),避免错误。 ### 📊 示例验证 | N | M | 矩形个数 | |---|----|----------| | 1 | 1 | 1 | | 2 | 2 | 9 | | 3 | 4 | 60 | | 5 | 5 | 225 | *验证*:2×2 棋盘有 9 个矩形(1个大 + 4个1×1 + 2个横2×1 + 2个竖1×2)。 ### 💡 替代方案讨论 1. **暴力枚举法**:`O(N² * M²)` 枚举所有左上/右下角点,复杂度高(N,M=100 时约 10^8 次运算,可能超时),不推荐。 2. **组合数学公式法**(本方案):`O(1)` 时间复杂度,数学优美,推荐使用。 ### ⚠️ 常见陷阱与规避 - **数据类型溢出**:当 N,M 接近更大值(如 10^5)时,`int` 会溢出,务必用 `long long` 或 `__int128`。 - **除法的时机**:先乘后除可能导致无法整除,但此处 `N*(N+1)` 必为偶数,所以 `N*(N+1)/2` 安全。但推荐先除后乘以保证效率与正确性。 - **输入输出格式**:题目要求输出一行一个整数,注意换行符。 ### 🚀 扩展思考 - 若题目改为**正方形个数**,则公式变为:`Σ_{k=1}^{min(N,M)} (N-k+1)*(M-k+1)`。 - 若棋盘为 **N×M 的方格纸**,可以结合前缀和或循环优化递归问题。 ### 🧰 开发建议 - 使用 `long long` 处理计数类问题,**预防大数据量**。 - 写出清晰的注释,便于维护。 - 在本地测试边界条件:N=1, M=1 和 N=100, M=100。 ######[AI写代码神器 | 929点数解答 | 2026-08-28 20:42:44]
- 车载系统 UML 类图设计:涵盖 Car、Engine、娱乐系统等的完整类定义与关系解析 (字节豆包 | 760点数解答 | 2024-08-15 22:51:04)404
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)571
- C++实现滑动窗口最大值问题及开发建议(字节豆包 | 946点数解答 | 2026-08-15 16:07:43)24
- 使用C++解决滑动窗口最大值查找问题的实现与优化(字节豆包 | 555点数解答 | 2026-08-15 16:08:05)23
- C++实现滑动窗口最大值输出的解决方案及开发建议(字节豆包 | 718点数解答 | 2026-08-15 16:10:19)20
- Java 简单工厂模式:打造可扩展的几何图形绘图工具类(阿里通义 | 570点数解答 | 2024-11-30 14:40:37)219
- Java 运用简单工厂模式构建多几何形状绘图工具类全解析 (字节豆包 | 584点数解答 | 2024-11-30 14:41:44)206
- C++ 实现正方形黑白瓦片图案最小转换方法求解(字节豆包 | 817点数解答 | 2025-11-25 19:03:09)129
- Python 破解:计算 n*n 网格中只含 1 的最大矩形数字和! (字节豆包 | 534点数解答 | 2026-02-07 20:24:57)83
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)483
- C++ 实现游戏赢家判断:巧妙找出满足和条件的最大数 (DeepSeek | 506点数解答 | 2025-06-20 16:18:09)193
- C++ 实现根据部分橘子重量估算整箱橘子重量(字节豆包 | 371点数解答 | 2026-04-11 13:12:51)90