矩阵重塑(其一)

把矩阵按行优先展平成一维序列,再按新矩阵的列数重新解释每个元素的位置。

OJ: shumeng

题目 ID: CSP202406A

难度:入门

标签:模拟矩阵

日期: 2026-07-31 16:21

形式化题目

给定一个 n×mn \times m 矩阵与目标形状 p×qp \times q,满足 n×m=p×qn \times m = p \times q

按行优先顺序读取原矩阵的元素,再按行优先顺序填入 p×qp \times q 新矩阵并输出。

思路

行优先重塑不会改变元素在一维线性序列中的顺序,本质是“换一种方式解释同一串数据”。

保存线性序列

按行优先依次读入全部 n×mn \times m 个元素,存入一维数组 value

用新列数定位

新矩阵第 ii 行第 jj 列的元素,正是线性序列中的第 i×q+ji \times q + j 个,直接输出 value[i * q + j] 即可。

代码

cpp
/**
 * Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
 * rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
 * rainboy的学习导航网站: https://idx.roj.ac.cn
 * create_at: 2026-07-31 16:21
 * update_at: 2026-08-17 22:39
 */
#include <bits/stdc++.h>
using namespace std;

const int MAXN = 10005;

int value[MAXN]; // 行优先顺序读取的线性序列

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, m, p, q;
    cin >> n >> m >> p >> q;
    for (int i = 0; i < n * m; i++) cin >> value[i];

    // 重塑不改变行优先线性顺序,只需按新列数 q 重新解释下标
    for (int i = 0; i < p; i++) {
        for (int j = 0; j < q; j++) {
            if (j > 0) cout << ' ';
            cout << value[i * q + j];
        }
        cout << '\n';
    }

    return 0;
}

复杂度

  • 时间:每个元素读取与输出一次,时间复杂度 O(nm)O(nm)
  • 空间:保存整个线性序列,空间复杂度 O(nm)O(nm)

总结

矩阵重塑只改变二维下标,不改变行优先线性顺序。先固定线性序号,再用新列数 qq 计算行列下标,就能在一维数组上直接完成重塑。