OneCoder Avatar
OneCodercoderli.com · 937 篇博文
【GESP】C++四级真题 luogu-B4264 [GESP202503 四级] 二阶矩阵📷 题解插图

【GESP】C++四级真题 luogu-B4264 [GESP202503 四级] 二阶矩阵

📅 2025-09-14·✍️ OneCoder·计算中...·⏱️ 5 分钟
#GESP#C++#多维数组

GESP C++四级2025年3月真题。本题主要考查二维数组的应用。属于四级题中的简单题。难度⭐⭐☆☆☆。本题在洛谷评定为入门

luogu-B4264 [GESP202503 四级] 二阶矩阵

题目要求

题目描述

小 A 有一个 nnmm 列的矩阵 AA

小 A 认为一个 2×22 \times 2 的矩阵 DD 是好的,当且仅当 D1,1×D2,2=D1,2×D2,1D_{1,1} \times D_{2,2} = D_{1,2} \times D_{2,1}。其中 Di,jD_{i,j} 表示矩阵 DD 的第 ii 行第 jj 列的元素。

小 A 想知道 AA 中有多少个好的子矩阵。

输入格式

第一行,两个正整数 n,mn, m

接下来 nn 行,每行 mm 个整数 Ai,1,Ai,2,,Ai,mA_{i,1}, A_{i,2}, \ldots, A_{i,m}

输出格式

一行,一个整数,表示 AA 中好的子矩阵的数量。

输入输出样例 #1

输入 #1
PLAINTEXT
3 4
1 2 1 0
2 4 2 1
0 3 3 0
输出 #1
PLAINTEXT
2

说明/提示

样例解释

样例中好的子矩阵如下:

luogu-b4264

数据范围

对于所有测试点,保证 1n5001\leq n\leq 5001m5001\leq m\leq 500100Ai,j100-100\leq A_{i,j}\leq 100


题目分析

本题的核心是在一个n×mn \times m的矩阵中,找出所有满足条件的2×22 \times 2子矩阵。

1. 数据结构设计

  • 使用二维数组num_ary[505][505]存储输入矩阵
  • 数组大小设置为505是为了满足题目要求的最大范围(n,m500n,m \leq 500)

2. 核心算法思路

  • 遍历所有可能的2×2子矩阵左上角位置
  • 行遍历范围:[0, n-2],确保有足够空间容纳2×2矩阵
  • 列遍历范围:[0, m-2],同理
  • 判断:
    • 主对角线:num_ary[i][j]num_ary[i+1][j+1]
    • 副对角线:num_ary[i][j+1]num_ary[i+1][j]
    • 满足条件:num_ary[i][j] * num_ary[i+1][j+1] == num_ary[i][j+1] * num_ary[i+1][j]

3. 算法复杂度分析

  1. 时间复杂度

    • 遍历所有可能的 2×22 \times 2 子矩阵左上角:O((n1)×(m1))O((n-1) \times (m-1))
    • 每个位置的判断操作:O(1)O(1)
    • 总体时间复杂度:O(n×m)O(n \times m)
  2. 空间复杂度

    • 存储输入矩阵:O(n×m)O(n \times m)
    • 其他变量:O(1)O(1)
    • 总体空间复杂度:O(n×m)O(n \times m)

示例代码

CPP
#include <iostream>

// 定义二维数组存储矩阵元素,最大支持500x500的矩阵
int num_ary[505][505];

int main() {
    // 定义矩阵的行数n和列数m
    int n, m;
    // 读入矩阵的行数和列数
    std::cin >> n >> m;

    // 读入矩阵的所有元素
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            std::cin >> num_ary[i][j];
        }
    }

    // 计数器,用于统计满足条件的2x2子矩阵的个数
    int count = 0;

    // 遍历所有可能的2x2子矩阵左上角位置
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < m - 1; j++) {
            // 判断当前2x2子矩阵是否满足条件:主对角线元素乘积等于副对角线元素乘积
            if (num_ary[i][j] * num_ary[i+1][j+1] == num_ary[i][j+1] * num_ary[i+1][j]) {
                count++;
            }
        }
    }

    // 输出结果
    std::cout << count;
    return 0;
}

💡 OneCoder 资源指引

所有代码开源上传至 GitHub:yummy-code 仓库 · GESP 专题站:GESP WIKI

🤝 技术交流与答疑

欢迎加入:C++ GESP/CSP 考级答疑群(688906745)Java/Python交流群(982860385),点击可直接加群。

📚

猜你想读 · 相关文章推荐

OneCoder

OneCoder (lihongzheshuai)

一个中年人的自留地,记录学习 C++、GESP/NOI、Java、Python 与算法架构的心得体会。本站唯一网址:coderli.com

💬 读者留言与交流

0 条讨论
✨ 支持 Markdown 语法格式
还没有留言,快来成为第一个讨论者吧!