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,这保证了元素的总数不变。
- 线性化原矩阵: 按照行优先的顺序,将原矩阵 M M M的元素转换成一个长度为 n × m n \times m n×m的一维数组 A A A。这意味着你先读取 M M M的第 0 0 0行元素,然后是第 1 1 1行,依此类推,直到最后一行。
- 填充新矩阵: 使用一维数组 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
代码块:
/*************************************************************************
> 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;
}