创作想法是因为像我当初大一时候想参加一些比赛但是奈何只学了c和c相关数据结构,但是对于许多竞赛的题目的题解往往都是c++或者其他面向对象的编程语言,让我们难以在c语言基础上入手这些比较复杂的题目。
创造的目的是为了帮助各位同时提高我对c语言编程的理解和锻炼个人能力,废话不多说上菜!!
1.矩阵重塑(其一)
刷新
时间限制: 1.0 秒
空间限制: 512 MiB
相关文件: 题目目录(样例文件)
题目背景
矩阵(二维)的重塑(reshape)操作是指改变矩阵的行数和列数,同时保持矩阵中元素的总数不变。
题目描述
矩阵的重塑操作可以具体定义为以下步骤:
设原矩阵为 𝑀M,其维度为 𝑛×𝑚n×m,即有 𝑛n 行和 𝑚m 列。新矩阵为 𝑀′M′,其维度为 𝑝×𝑞p×q。重塑操作要满足 𝑛×𝑚=𝑝×𝑞n×m=p×q,这保证了元素的总数不变。
- 线性化原矩阵:按照行优先的顺序,将原矩阵 𝑀M 的元素转换成一个长度为 𝑛×𝑚n×m 的一维数组 𝐴A。这意味着你先读取 𝑀M 的第 00 行元素,然后是第 11 行,依此类推,直到最后一行。
- 填充新矩阵:使用一维数组 𝐴A 中的元素按照行优先的顺序填充新矩阵 𝑀′M′。首先填充 𝑀′M′ 的第 00 行,直到该行有 𝑞q 个元素,然后继续填充第 11 行,直到所有 𝑝p 行都被填满。
给定原矩阵中的一个元素的位置 (𝑖,𝑗)(i,j)(0≤𝑖<𝑛0≤i<n 且 0≤𝑗<𝑚0≤j<m),我们可以找到这个元素在被线性化后的一维数组 𝐴A 中的位置 𝑘k(0≤𝑘<𝑛×𝑚0≤k<n×m),然后确定它在新矩阵 𝑀′M′ 中的位置 (𝑖′,𝑗′)(i′,j′)(0≤𝑖′<𝑝0≤i′<p 且 0≤𝑗<𝑞0≤j<q)。它们之间满足如下数学关系:𝑖×𝑚+𝑗=𝑘=𝑖′×𝑞+𝑗′i×m+j=k=i′×q+j′
给定 𝑛×𝑚n×m 的矩阵 𝑀M 和目标形状 𝑝p、𝑞q,试将 𝑀M 重塑为 𝑝×𝑞p×q 的矩阵 𝑀′M′。
输入格式
从标准输入读入数据。
输入共 𝑛+1n+1 行。
输入的第一行包含四个正整数 𝑛n、𝑚m 和 𝑝p、𝑞q。
接下来依次输入原矩阵 𝑀M 的第 00 到第 𝑛−1n−1 行,每行包含 𝑚m 个整数,按列下标从 00 到 𝑚−1m−1 的顺序依次给出。
输出格式
输出到标准输出。
输出共 𝑝p 行,每行 𝑞q 个整数,表示重塑后的矩阵 𝑀′M′。输出格式与输入相同,即依次输出 𝑀′M′ 的第 00 行到第 𝑝−1p−1 行;行内按列下标从 00 到 𝑞−1q−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 均为正整数且 𝑛×𝑚=𝑝×𝑞≤104n×m=p×q≤104;
- 输入矩阵中每个元素的绝对值不超过 10001000。
来自 <TUOJ>
tip:上面看不请 我在单独拿出来
主函数部分------
具体函数部分--------
然后实现功能 即可通过:
下面是完整代码:
#include<stdlib.h>
#include<stdio.h>
int** RecreatMatrix(int** a, int n, int m, int p, int q)
{
// 变量初始
int* tmp = (int*)malloc(n*m*sizeof(int));// 中间矩阵
int size = 0;//
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
tmp[size++]=a[i][j];
}
}
// 创建目