top1编程
← 返回题目
题解

【提高】棋盘格数

1 条题解

  • 0
    @ 2026-7-31 16:25:48

    解题思路

    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