当前位置: 首页 > news >正文

CCF CSP 第34次(2024.06)(1_矩阵重塑(其一)_C++)

CCF CSP 第34次(2024.06)(1_矩阵重塑(其一)_C++)

    • 题目背景:
    • 题目描述:
    • 输入格式:
    • 输出格式:
    • 样例1输入:
    • 样例1输出:
    • 样例2输入:
    • 样例2输出:
    • 子任务:
    • 提示:
      • 解题思路:
        • 思路一:
      • 代码实现
        • 代码实现(思路一):

时间限制: 1.0 秒
空间限制: 512 MiB

题目背景:

矩阵(二维)的重塑(reshape)操作是指改变矩阵的行数和列数,同时保持矩阵中元素的总数不变。

题目描述:

矩阵的重塑操作可以具体定义为以下步骤:
设原矩阵为 𝑀M,其维度为 n×m,即有 n 行和 m 列。新矩阵为 M′,其维度为 p×q。重塑操作要满足 n×m=p×q,这保证了元素的总数不变。

  1. 线性化原矩阵:按照行优先的顺序,将原矩阵 M 的元素转换成一个长度为 n×m 的一维数组 A。这意味着你先读取 M 的第 0 行元素,然后是第 1 行,依此类推,直到最后一行。
  2. 填充新矩阵:使用一维数组 A 中的元素按照行优先的顺序填充新矩阵 M′。首先填充 M′ 的第 0 行,直到该行有 q 个元素,然后继续填充第 1 行,直到所有 p 行都被填满。

给定原矩阵中的一个元素的位置 (i,j)(0≤i<n 且 0≤j<m),我们可以找到这个元素在被线性化后的一维数组 A 中的位置 k(0≤k<n×m),然后确定它在新矩阵 M′ 中的位置 (i′,j′)(0≤i′<p 且 0≤j<q)。它们之间满足如下数学关系:i×m+j=k=i′×q+j′

给定 n×m 的矩阵 𝑀M 和目标形状 p、q,试将 M 重塑为 p×q 的矩阵 M′。

输入格式:

从标准输入读入数据。

输入共 n+1 行。

输入的第一行包含四个正整数 n、m 和 p、q。

接下来依次输入原矩阵 M 的第 0 到第 n−1 行,每行包含 m 个整数,按列下标从 0 到 m−1 的顺序依次给出。

输出格式:

输出到标准输出。

输出共 p 行,每行 q 个整数,表示重塑后的矩阵 M′。输出格式与输入相同,即依次输出 M′ 的第 0 行到第 p−1 行;行内按列下标从 0 到 q−1 的顺序输出,且两个整数间仅用一个空格分隔。

样例1输入:

2 3 3 2
1 2 3
4 5 6

样例1输出:

1 2
3 4
5 6

样例2输入:

2 2 1 4
6 6
6 6

样例2输出:

6 6 6 6

子任务:

全部的测试数据满足:

  • n、m 和 p、q 均为正整数且 n×m=p×q≤104;
  • 输入矩阵中每个元素的绝对值不超过 1000。

提示:

评测环境仅提供各语言的标准库,特别地,不提供任何线性代数库(如 numpy、pytorch 等)。

解题思路:

思路一:

1、解题步骤拆分:
① 数据输入:
第一行输入4个整数 n m p q ,n和m代表M矩阵的长和宽,p和q代表重塑矩阵的长和宽。
接下来n行输入 nm 矩阵。
② 数据处理:在输入时直接将 n
m 矩阵存储在一维数组中,使用一位数组来进行 p*q 矩阵的重塑。
③ 数据输出:我们只需要在重塑时每行输出 p 个元素,依次输出 q 行则可实现结果的输出。

代码实现

代码实现(思路一):
#include<iostream>  
#include<vector>    
using namespace std;

int main(int argc, char const *argv[])
{
    // 读取输入的四个整数:n, m, p, q
    int n, m, p, q;
    cin >> n >> m >> p >> q;
    
    // 计算总元素数目 num = n * m
    int num = n * m;

    // 创建一个整数类型的向量 M 用来存储矩阵元素
    vector<int> M;
    int k;

    // 读取 n * m 个整数并存储到向量 M 中
    for (int i = 0; i < num; i++){
        cin >> k;    // 读取一个整数
        M.push_back(k);  // 将该整数添加到向量 M 的末尾
    }

    // 用 k 来表示当前读取的元素索引
    k = 0;

    // 打印出 p 行 q 列的矩阵
    for (int i = 0; i < p; i++){
        for (int j = 0; j < q; j++){
            cout << M[k];  // 打印出当前的矩阵元素
            if (j != q - 1){  // 如果不是该行的最后一个元素
                cout << " ";  // 在元素之间输出一个空格
            }
            k++;  // 移动到下一个元素
        }
        cout << endl;  // 打印完一行后换行
    }

    return 0;  
}

欢迎大家和我沟通交流(✿◠‿◠)

相关文章:

  • 【OCR】技术
  • 关于计算机视觉中的插值小记
  • Ansible:playbook实战案例
  • PaddleX产线集成功能的使用整理
  • 第21周:RestNet-50算法实践
  • 独立站怎么推广运营?详细教程和引流重点
  • 刚刚整理实测可用的股票数据API接口集合推荐:同花顺、雅虎API、智兔数服、聚合数据等Python量化分析各项数据全面丰富
  • 94二叉树中序遍历解题记录
  • SpringCloud ------尚硅谷2024篇
  • Go 语言标准库中path模块详细功能介绍与示例
  • 29、web前端开发之CSS3(六)
  • 基于大模型的pc版语音对话问答
  • SQL优化 | OceanBase是否遵循最左匹配原则?(三)
  • SpringBoot学习笔记3.27
  • 集成开发环境革新:IntelliJ IDEA与Cursor AI的智能演进
  • 1.1-站点差异\源码差异\数据存储差异\MVC模型
  • CSP-J/S冲奖第20天:选择排序
  • 蓝桥杯备考:拓扑排序+DFS(信息传递)
  • 数据库同步中间件PanguSync:如何跳过初始数据直接进行增量同步
  • Android生态大变革,谷歌调整开源政策,核心开发不再公开
  • 网站的积分系统怎么做/品牌网站建设解决方案
  • 做网站被用作非法用途/软文写手
  • 网站建设国外拂去其/aso优化怎么做
  • 关于企业网站建设的必要性/优化大师在哪里
  • 网页链接制作软件/长沙seo优化公司
  • 网站添加flv视频代码/网络广告营销案例有哪些