CCF-CSP 2024 --重塑矩阵1,2c语言题解

news2025/7/7 2:11:45

  创作想法是因为像我当初大一时候想参加一些比赛但是奈何只学了c和c相关数据结构,但是对于许多竞赛的题目的题解往往都是c++或者其他面向对象的编程语言,让我们难以在c语言基础上入手这些比较复杂的题目。

  创造的目的是为了帮助各位同时提高我对c语言编程的理解和锻炼个人能力,废话不多说上菜!!

1.矩阵重塑(其一)

刷新 

时间限制: 1.0 秒

空间限制: 512 MiB

相关文件: 题目目录(样例文件)

题目背景

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

题目描述

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

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

  1. 线性化原矩阵:按照行优先的顺序,将原矩阵 𝑀M 的元素转换成一个长度为 𝑛×𝑚n×m 的一维数组 𝐴A。这意味着你先读取 𝑀M 的第 00 行元素,然后是第 11 行,依此类推,直到最后一行。
  2. 填充新矩阵:使用一维数组 𝐴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];
		}
	}
	// 创建目标矩阵 obj 
	int** obj = (int**)malloc(p * sizeof(int*));
	for (int i = 0; i < p; i++)
	{
		obj[i] = (int*)malloc(q * sizeof(int));
	}
	// 存放元素吧
	for (int i = 0; i < n; i++)
	{
		free(a[i]);

	}
	free(a);
	int x = 0;
	for (int i = 0; i < p; i++)
	{
		for (int j = 0; j < q; j++)
		{
			obj[i][j] = tmp[x];
			x++;
		}
	}
	return obj;
}

int main()
{
	int n = 0;
	int m = 0;
	int p = 0;
	int q = 0;
	scanf("%d %d %d %d",&n,&m,&p,&q);
	int** matrix = (int**)malloc( n*sizeof(int*));
	for (int i = 0;i < n; i++)
	{
		matrix[i] = (int*)malloc(m*sizeof(int));
	}
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			scanf("%d", &matrix[i][j]);
		}
	}
	
	// 调用函数 更改行和列 

	matrix = RecreatMatrix(matrix,n, m, p, q);



	for (int i = 0; i < p; i++)
	{
		for (int j = 0; j < q; j++)
		{
			printf("%d ", matrix[i][j]);
		}
		printf("\n");
	}
	
	//确保严谨 记得销毁哦 遍历的类似思路可以拿过来

	for (int i = 0; i < p; i++)
	{
		free(matrix[i]);
		
	}
	free(matrix);
	matrix = NULL;

	return 0;
}

2.重塑矩阵二----依然动态实现

时间限制: 1.0 秒

空间限制: 512 MiB

相关文件: 题目目录(样例文件)

题目背景

矩阵转置操作是将矩阵的行和列交换的过程。在转置过程中,原矩阵 𝐴A 的元素 𝑎𝑖𝑗aij 会移动到转置后的矩阵 𝐴𝑇AT 的 𝑎𝑗𝑖aji 的位置。这意味着 𝐴A 的第 𝑖i 行第 𝑗j 列的元素在 𝐴𝑇AT 中成为了第 𝑗j 行第 𝑖i 列的元素。

例如,有矩阵 𝐴A 如下:

𝐴=[𝑎𝑏𝑐𝑑𝑒𝑓]A=[adbecf]

它的转置矩阵 𝐴𝑇AT 会是:

𝐴𝑇=[𝑎𝑑𝑏𝑒𝑐𝑓]AT=abcdef​​

矩阵转置在线性代数中是一个基本操作,广泛应用于各种数学和工程领域。

题目描述

给定 𝑛×𝑚n×m 的矩阵 𝑀M,试编写程序支持以下查询和操作:

  1. 重塑操作 𝑝p𝑞q:将当前矩阵重塑为 𝑝×𝑞p×q 的形状(重塑的具体定义见上一题);
  2. 转置操作:将当前矩阵转置;
  3. 元素查询 𝑖i𝑗j:查询当前矩阵第 𝑖i 行 𝑗j 列的元素(0≤𝑖<𝑛0≤i<n 且 0≤𝑗<𝑚0≤j<m)。

依次给出 𝑡t 个上述查询或操作,计算其中每个查询的结果。

输入格式

从标准输入读入数据。

输入共 𝑛+𝑡+1n+t+1 行。

输入的第一行包含三个正整数 𝑛n𝑚m 和 𝑡t

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

接下来输入 𝑡t 行,每行包含形如 op a b 的三个整数,依次给出每个查询或操作。具体输入格式如下:

  • 重塑操作:1 p q
  • 转置操作:2 0 0
  • 元素查询:3 i j

输出格式

输出到标准输出。

每个查询操作输出一行,仅包含一个整数表示查询结果。

样例1输入

解释

3 2 3
1 2
3 4
5 6
3 0 1
1 2 3
3 1 2

样例1输出

2
6

样例2输入

解释

3 2 5
1 2
3 4
5 6
3 1 0
2 0 0
3 1 0
1 3 2
3 1 0

样例2输出

3
2
5

初始矩阵: [123456]135246​​, (1,0)(1,0) 位置元素为 33

转置后: [135246][123456], (1,0)(1,0) 位置元素为 22

重塑后: [135246]154326​​, (1,0)(1,0) 位置元素为 55

子任务

8080 的测试数据满足:

  • 𝑡≤100t≤100

全部的测试数据满足:

  • 𝑡≤105t≤105 且其中转置操作的次数不超过 100100
  • 𝑛n𝑚m 和所有重塑操作中的 𝑝p𝑞q 均为正整数且 𝑛×𝑚=𝑝×𝑞≤104n×m=p×q≤104
  • 输入矩阵中每个元素的绝对值不超过 10001000

提示

  • 对于 𝑛×𝑚n×m 的矩阵,虽然转置和重塑操作都可以将矩阵形态变为 𝑚×𝑛m×n,但这两种操作通常会导致不同的结果。
  • 评测环境仅提供各语言的标准库,特别地,不提供任何线性代数库(如 numpypytorch 等)。

来自 <TUOJ>

完整代码:

#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];
        }
    }
    // 创建目标矩阵 obj 
    int** obj = (int**)malloc(p * sizeof(int*));
    for (int i = 0; i < p; i++)
    {
        obj[i] = (int*)malloc(q * sizeof(int));
    }
    // 存放元素吧
    for (int i = 0; i < n; i++)
    {
        free(a[i]);

    }
    free(a);
    int x = 0;
    for (int i = 0; i < p; i++)
    {
        for (int j = 0; j < q; j++)
        {
            obj[i][j] = tmp[x];
            x++;
        }
    }
    return obj;
}

int** transpose(int** a, int n, int m)
{
    int p = m;
    int q = n;
    int** obj = (int**)malloc(p * sizeof(int*));
    for (int i = 0; i < p; i++)
    {
        obj[i] = (int*)malloc(q * sizeof(int));
    }
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            obj[j][i] = a[i][j];
        }
    }
    // 记得销毁哦
    for (int i = 0; i < n; i++)
    {
        free(a[i]);

    }
    free(a);
    return obj;

}


// 查询功能
int Find_x(int** a,int i, int j)
{
    return a[i][j];
}


int main()
{
    int n = 0;
    int m = 0;
    int t = 0;

    scanf("%d %d %d", &n, &m, &t);
    int** matrix = (int**)malloc(n * sizeof(int*));
    for (int i = 0; i < n; i++)
    {
        matrix[i] = (int*)malloc(m * sizeof(int));
    }
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            scanf("%d", &matrix[i][j]);
        }
    }

    // 进入功能使用部分
    while (t--)
    {
        int input = 0;
        scanf("%d",&input);
        if (input == 1)
        {
            int p = 0;
            int q = 0;
            scanf("%d %d", &p, &q);
            matrix = RecreatMatrix(matrix, n, m, p, q);
            n = p;
            m = q;
        }
        else if (input == 2)
        {
            int p = 0;
            int q = 0;
            scanf("%d %d", &p, &q);
            matrix = transpose(matrix, n,  m);
            int tmp = n;
            n = m;
            m = tmp;
            
        }
        else if (input == 3)
        {
            int i = 0;
            int j = 0;
            scanf("%d %d", &i, &j);
            int x = Find_x(matrix,i,j);
            printf("%d\n",x);
        }

    }
    for (int i = 0; i < n; i++)
    {
        free(matrix[i]);

    }
    free(matrix);

}

3. 思路的缺陷-----以及建议

缺陷

  (重塑矩阵二)简单发现代码提交之后会存在一些测试案例显示占用内存空间超出限制,这里我认为因为其中主要原因是因为:

  频繁使用malloc这样的动态内存分布函数使得堆上的内存使用free后内存碎片化,使得之后没有一块连续的足够大的内存存放数据。

  另一个缺陷就是我们使用malloc函数的时候都没有判空,其实严谨来说咱还是判空一下(读者自行解决咯)

建议

 其实我们可以创建静态矩阵来存放数据,初始化该矩阵直接最大值即可,然后开始实现吧。

我这里仅对重塑矩阵部分进行提示,其他部分都很简单大家自己想想吧。

  这里我们要用到数组指针。传递二维数组嘛

是吧更加简单明了。

  好的这期就到这里非常感谢各位的支持你的小红心就是对我最大的鼓励。谢谢咯

补充: 非常抱歉,经过我后面再度调试发现我们的动态其实能过。

之所以前面内存超载了,是因为我在一个重塑矩阵函数中忘记释放一个中间载体一维数组了。

修改之后就是加一个free(tmp)即可。

至于前面的建议也可以采纳,以及对于malloc的缺陷也可以了解一下我就不删除了。谢谢咯

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2107124.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue2-elementUI-初始化启动项目-git

前置基础 资料下载-阿里云盘 vueaxioselement-uinpmvscode 初始化项目 1.创建vue2工程 1.1 vue create projectName1.2 选择 1.3 初始化 vue-cli 的核心步骤&#xff1a; Manually select features (*) Babel ( ) TypeScript ( ) Progressive Web App (PWA) Support …

计算机毕业设计选题推荐-企业会议室管理系统-Java/Python项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

Java企业电子招投标系统:Spring Cloud微服务架构-强化企业招采竞争力:电子化招投标平台助力效率与成本控制-支持二次开发

​在当今激烈的市场竞争环境下&#xff0c;企业规模的持续扩大使得招采管理变得日益重要&#xff0c;已成为企业提升核心竞争力的关键一环。为了实现更高效、更高质量的招采成果&#xff0c;我们设计了一套基于电子化平台的解决方案&#xff0c;旨在通过电子化招投标系统&#…

HarmonyOS开发实战( Beta5版)状态管理优秀实践

为了帮助应用程序开发人员提高其应用程序质量&#xff0c;特别是在高效的状态管理方面。本章节面向开发者提供了多个在开发ArkUI应用中常见的低效开发的场景&#xff0c;并给出了对应的解决方案。此外&#xff0c;还提供了同一场景下&#xff0c;推荐用法和不推荐用法的对比和解…

STM32 HAL CAN (TJA1050CAN模块) 通讯(一)理论

1、简介 CAN具备多个设备交互的能力,但是网上大多是两个单片机进行交互,或者单片机通过CAN收发器与上位机进行交互测试,本次通过STM32cubeMX完成CAN通讯配置,并通过多个单片机进行数据交互测试。 2、CAN简介 CAN是一种串行通讯协议,主要有低速、高速CAN两种。 低速CAN…

bug“医典”

温馨提示&#xff1a;本篇文章主要用于收藏博主所遇到的各种bug,并且不定期更新 未初始化 “病状” “处方” 在需要的位置进行初始化即可 数组越界 “病状” “处方” 修改原理&#xff1a;越界通常是下标或者指针因为没有合适的控制&#xff0c;导致其走出了边界&#xf…

5G速度救援加速:工业边缘网关为智慧消防赢得每一秒!

项目背景 近年来&#xff0c;火灾频发&#xff0c;面对火灾的不可预测性和潜在的巨大破坏力&#xff0c;传统防控手段显得力不从心。 在《关于全面推进“智慧消防”建设的指导意见》等国家政策的积极推动下&#xff0c;智慧消防系统有效预防火灾发生和提高火灾扑救效率&#x…

美股、日本和韩国股市大跌,“黑色星期一”将重现?

KlipC报道&#xff1a;9月开始&#xff0c;全球市场再度迎来大跌。美东时间9月3日&#xff0c;美股三大指数全线大跌&#xff1b;9月4日&#xff0c;日本和韩国股市也出现大跌。市场对AI的乐观情绪减弱&#xff0c;英伟达股价在9月3日暴跌9.5%&#xff0c;市值缩水2790亿美元。…

睡岗检测数据集(工作 课堂等) 3100张 增强 睡岗趴睡 带标注 voc yolo

睡岗检测是一项重要的安全监测任务&#xff0c;尤其是在需要高度警觉的工作环境中。该数据集旨在为研究人员和开发者提供一个高质量的、可用于训练和评估睡岗检测模型的数据集。 数据集特点 类型&#xff1a;睡岗检测图像数据集。规模&#xff1a;包含3100张图像&#xff0c;…

zblog自动生成文章插件(百度AI写作配图,图文并茂)

最近工作比较忙&#xff0c;导致自己的几个网站都无法手动更新&#xff0c;于是乎也想偷个懒把&#xff0c;让AI帮忙打理下自己的网站。我接触chatgpt等AI工具还是比较早了&#xff0c;从openai推出gpt3.5就一直在用&#xff0c;说实话&#xff0c;开始的时候用AI自动更新网站还…

高通智能模组:以卓越优势引领科技潮流

一、高通智能模组的崛起与发展 在通信技术发展中&#xff0c;高通智能模组出现。5G 兴起&#xff0c;对模组有更高要求&#xff0c;高通凭借积累和创新捕捉需求。早期致力于研发 5G 技术&#xff0c;优化技术降低功耗提高处理能力&#xff0c;展现性能优势。在竞争中&#xff0…

redis通用命令

TOC 目录 特性&#xff08;优点&#xff09; 存储方式 功能丰富 客户端语言多 数据存储位置 支持集群 支持主从复制 速度快 应用场景 数据库 排行榜系统 计数器应用 消息队列系统 redis客户端 基本全局命令 Keys EXISTS DEL EX…

版权与开源协议:一场创新与自由的边界之争

在数字时代的浪潮中&#xff0c;版权与开源协议作为知识产权领域的两大支柱&#xff0c;既相互依存又暗自较劲&#xff0c;共同绘制着科技创新的宏伟蓝图。本文将带您深入这场创新与自由的边界之争&#xff0c;探讨版权与开源协议之间的微妙关系&#xff0c;以及它们如何共同推…

【JAVA数据结构】(ArrayList)顺序表

ArrayList 是Java集合框架中的一个类&#xff0c;底层使用的数据结构就是顺序表&#xff0c;它实现了List接口&#xff0c;提供了动态数组的功能&#xff0c;ArrayList可以根据需要自动进行扩容&#xff08;不指定容量大小也能正常添加元素&#xff09;&#xff0c;允许存储任意…

城市智能厕所改造:让公厕智能化、信息化

在现代城市的发展进程中&#xff0c;城市智能厕所改造成为提升公共服务水平和城市品质的重要举措。让我们一同探讨城市智能厕所的智能化、信息化体现以及其重大意义。 一、城市智能厕所智能化体现 1. 智能引导系统&#xff1a;入口处的电子显示屏实时显示厕位使用情况&#xff…

赚多多V10自动任务网抢单源码-会员自营版

赚多多V10自动任务网抢单源码 会员自营版搭建视频教程 测试了一下&#xff0c;源码非常完整&#xff0c;短信对接的是云之讯&#xff0c;有喜欢的拿去研究&#xff0c;感谢大家对本站的支持 环境&#xff1a;Apache 2.4.46 mysql5.6 php7.2 注&#xff1a;压缩包内含搭建文…

分析多种解决vcruntime140_1.dll无法继续执行代码的方法,简单的修复手段分享

在使用电脑上的某些程序时遇到“无法继续执行代码&#xff0c;因为 vcruntime140_1.dll 找不到”或者该 DLL 文件损坏的错误消息&#xff0c;您需要采取一些措施来解决这个问题。这类问题通常是由于系统文件缺失或损坏引起的&#xff0c;但有多种方法可以帮助您解决这个问题并保…

靶场战神为何会陨落?

我从第一个SQL注入漏洞原理学起,从sql-libas到DVWA,到pikachu再到breach系列,DC系列靶场,再到实战挖洞,发现靶场与实战的区别是极其大的。 我个人觉得在这种web环境下,难的不是怎么测一个漏洞点,而是怎么找一个漏洞点。靶场与实战最大的区别在于你不知道这个地方到底有没有漏洞…

什么是场外个股期权?带大家一篇文章了解!

今天带你了解什么是场外个股期权&#xff1f;带大家一篇文章了解&#xff01;场外个股期权是指不在正式的交易所内&#xff0c;而是在场外市场通过双方直接协商的方式进行交易的个股期权。这种期权允许买卖双方根据自身的需求和风险偏好定制期权的条款&#xff0c;如行权价格、…

没有35类可以做特许经营加盟不!

前几天有个老客户找到普推知产商标老杨&#xff0c;没有35类可以做特许经营加盟不&#xff0c;在35类有个小类叫做“特许经营的商业管理”&#xff0c;但是35类这个主要指的为他人提供的&#xff0c;所以就是没有35类广告&#xff0c;照样就可以做特许经营加盟。 比如已经有43…