题解
【提高】棋盘格数
1 条题解
-
0
解题思路
N×M 棋盘,统计里面有多少个正方形和多少个长方形(不含正方形)。
正方形个数:
边长为 k 的正方形有 (N-k+1)×(M-k+1) 个。把所有边长(从 1 到 min(N,M))的正方形数加起来就是正方形总数。
长方形总数(含正方形):
在 N×M 的棋盘里选一个长方形,就是横着选两条边界线、竖着选两条边界线。
- 横着选两条线有 N(N+1)/2 种
- 竖着选两条线有 M(M+1)/2 种
- 所以长方形总数 = N(N+1)/2 × M(M+1)/2
长方形(不含正方形)= 长方形总数 - 正方形个数。
举例:2×3 棋盘
- 正方形:边长 1 有 6 个,边长 2 有 2 个,共 8 个
- 长方形总数 = 3 × 6 = 18
- 长方形(不含正方形)= 18 - 8 = 10
参考代码
#include <iostream> using namespace std; int main() { int n, m; cin >> n >> m; int s1 = n * m; // 正方形个数 int a = n, b = m; while (a > 1 && b > 1) { a--; b--; s1 += a * b; } int total = (n * (n + 1) / 2) * (m * (m + 1) / 2); // 长方形总数 int s2 = total - s1; // 长方形(不含正方形) cout << s1 << " " << s2 << endl; return 0; }复杂度分析
- 时间复杂度:O(min(N,M)),累加正方形
- 空间复杂度:O(1)
- 1