C++ //CCF-CSP计算机软件能力认证 202406-1 矩阵重塑(其一)

CCF-CSP计算机软件能力认证 202406-1

矩阵重塑(其一)

题目背景

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

题目描述

矩阵的重塑操作可以具体定义为以下步骤:

设原矩阵为 M M M,其维度为 n × m n \times m n×m,即有 n n n行和 m m m列。新矩阵为 M ′ M' M′,其维度为 p × q p \times q p×q。重塑操作要满足 n × m = p × q n \times m = p \times q n×m=p×q,这保证了元素的总数不变。

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

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

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

输入格式

从标准输入读入数据。

输入共 n + 1 n+1 n+1行。

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

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

输出格式

输出到标准输出。

输出共 p p p行,每行 q q q个整数,表示重塑后的矩阵 M ′ M' M′。输出格式与输入相同,即依次输出 M ′ M' M′的第 0 0 0行到第 p − 1 p-1 p−1行;行内按列下标从 0 0 0到 q − 1 q-1 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 n n、 m m m和 p p p、 q q q均为正整数且 n × m = p × q ≤ 1 0 4 n \times m = p \times q \le 10^4 n×m=p×q≤104;
  • 输入矩阵中每个元素的绝对值不超过1000。
环境:Linux Ubuntu(云服务器)
工具:vim
代码块:
cpp 复制代码
/*************************************************************************
	> File Name: ex20240601.cpp
	> Author: 
	> Mail: 
	> Created Time: Fri 14 Jun 2024 02:39:03 PM CST
 ************************************************************************/

#include<iostream>
using namespace std;

void initialMatrix(int n, int m, int ***matrix){
	*matrix = (int**)malloc(n * sizeof(int*));
	for(int i = 0; i < n; i++){
		(*matrix)[i] = (int*)malloc(m * sizeof(int));
	}
}

void freeMatrix(int n, int m, int ***matrix){
	for(int i = 0; i < n; i++){
		free((*matrix)[i]);
	}
	free(*matrix);
}

void inputMatrix(int n, int m, int **matrix){
	for(int i = 0; i < n; i++){
		for(int j = 0; j < m; j++){
			cin>>matrix[i][j];
		}
	}
}

void outputMatrix(int p, int q, int **matrix){
	for(int i = 0; i < p; i++){
		for(int j = 0; j < q; j++){
			cout<<matrix[i][j]<<" ";
		}
		cout<<endl;
	}
}

void reshape(int n, int m, int p, int q, int **matrix, int **newMatrix){
	int total = n * m;
	int *temp = (int*)malloc(total * sizeof(int));

	for(int i = 0, k = 0; i < n; i++){
		for(int j = 0; j < m; j++){
			temp[k++] = matrix[i][j];
		}
	}

	for(int i = 0, k = 0; i < p; i++){
		for(int j = 0; j < q; j++){
			newMatrix[i][j] = temp[k++];
		}
	}

	free(temp);
}

int main(){
	int n, m, p, q;
	int **matrix = NULL;
	int **newMatrix = NULL;

	cin>>n>>m>>p>>q;

	initialMatrix(n, m, &matrix);
	inputMatrix(n, m, matrix);

	initialMatrix(p, q, &newMatrix);
	reshape(n, m, p, q, matrix, newMatrix);

	outputMatrix(p, q, newMatrix);

	freeMatrix(n, m, &matrix);
	freeMatrix(p, q, &newMatrix);

	return 0;
}
运行结果显示如下
相关推荐
君义_noip1 小时前
信息学奥赛一本通 1607:【 例 2】任务安排 2 | 洛谷 P10979 任务安排 2
算法·动态规划·信息学奥赛·斜率优化
Bluesonli1 小时前
第 1 天:UE5 C++ 开发环境搭建,全流程指南
开发语言·c++·ue5·虚幻·unreal engine
因兹菜1 小时前
[LeetCode]day4 977.有序数组的平方
数据结构·算法·leetcode
憨猪在度假2 小时前
Cmake学习笔记
c++·笔记·学习
weixin_537590452 小时前
《C程序设计》第六章练习答案
c语言·c++·算法
iloveas20142 小时前
three.js+WebGL踩坑经验合集(6.2):负缩放,负定矩阵和行列式的关系(3D版本)
3d·矩阵·webgl
码农小苏242 小时前
K个不同子数组的数目--滑动窗口--字节--亚马逊
java·数据结构·算法
学游戏开发的2 小时前
UE学习日志#19 C++笔记#5 基础复习5 引用1
c++·笔记·学习·游戏引擎·unreal engine
BlackPercy2 小时前
[paddle] 矩阵相关的指标
线性代数·矩阵·paddle
CodeClimb2 小时前
【华为OD-E卷 - 最大矩阵和 100分(python、java、c++、js、c)】
java·c++·python·华为od·矩阵